我在理解以下代码时遇到困难:
class Base{
Base(){/* do stuff */};
};
class Deriv: public Base{
Deriv(){/* do stuff */};
};
// I have a problem understanding the purpose of the next line
Base &foo = *(new Deriv());
首先,你需要熟悉多态、引用、解引用和临时对象行为。
最流行的例子是动物。许多资料都用它来描述这个话题。
class Animal {};
class Dog : public Animal {};
int main() {
// All dogs are animals: OK
Animal* a = new Dog();
// Not every animal is a dog: Error
Dog* d = new Animal()
}
假设您正在创建一个游戏,您的玩家有一只宠物。
class WongPlayer {
Dog* pet;
}
这样说的话,宠物就只能是狗了
class CorrectPlayer {
Animal* pet;
}
在这种情况下,您可以将任何继承自 Animal 的类作为宠物。
这只是多态性用法的一个简单示例。
例子:
int a = 5;
int& b = a; // b is alias of a
b = 3; // a = 3
例子:
int* val = new int(1);
val = 5; // Error can't assign int to pointer
*val = 5; OK
delete val;
例子:
class A {
public:
A() { std::cout << "Created" << std::endl;}
~A() { std::cout << "Destroyed" << std::endl;}
}
int main {
A();
std::cout << "Should it be printed before destruction? No!" << std::endl;
return 0;
}
在您的情况下,您执行以下操作: 在堆中分配一个对象并返回它的指针。
new Deriv()
取消引用该指针
*(new Deriv())
创建引用并将其与新创建的对象绑定。
这里我们开始遇到一些问题。它不是临时对象!堆中的对象永远不会被破坏。 这是明显的内存泄漏
我不知道你为什么要创建一个参考。 最好的方法是创建一个指针。
Base* ptr = new Deriv();
然后
delete ptr;
就是这样。
但是是的,你也可以这样删除它
Base& ref = *(new Deriv());
delete &ref;