提问人:Panos Kontogiannis 提问时间:2/19/2023 更新时间:2/20/2023 访问量:63
通过派生类创建 C++ 基类成员 [已关闭]
C++ Base class member creation via derived class [closed]
问:
我在理解以下代码时遇到困难:
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());
答:
1赞
sens
2/19/2023
#1
首先,您需要熟悉多态性、引用、取消引用和临时对象行为。
- 某个类的每个对象都可以表示为(可以被视为)层次结构中较高的类的对象。
最流行的例子是动物。许多消息来源都用它来描述这个话题。
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 的任何类作为 pet。
这只是使用多态性的一个简单例子。
- 引用。 解释什么是引用的最好方法是将它们视为别名。 创建引用与创建别名完全相同。 而所有的限制也都通过这种方式得到了很好的理解。
例:
int a = 5;
int& b = a; // b is alias of a
b = 3; // a = 3
- 取消引用。 new 返回一个指针,因此要使用它指向的对象,必须首先取消引用它。
例:
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;
评论
Base* foo_temp = new Deriv(); Base& foo = *foo_temp;
foo_temp
std::bad_alloc
(std::nothrow)
foo.member
foo->member
Base* foo=new Deriv();