繁体   English   中英

运行时多态中的构造函数行为

[英]Constructor behaviour in runtime polymorphism

我们知道需要一个虚拟析构函数。

Base *bptr = new Derived();
delete bptr;

If a derived class object is pointed by a base class pointer and when the object goes out of scope, only the Base class destructor gets called unless the destructor is virtual.

我想知道在这种情况下构造函数如何正常工作。 由于 Base 指针指向 Derived object,因此应该只调用 Base 构造函数。 如何正确调用派生的 class 构造函数。

请解释一下这背后的原因。

new Derived() 在任何地方都没有基本的 class 参考。 您甚至可以选择将其分配给任何内容。 因此,将结果指针分配给什么不会影响构造。

当您执行以下操作时:

Base *bptr = new Derived();

您正在为Derived的 class 调用new运算符,因为这就是您正在构建的内容。

当您将new返回的Derived*分配给Base*时,您只是向上转换作为隐式操作的指针。

在使用new创建 object 时,我们拥有 object 的完整信息

new Derived(); // static type is same as dynamic type

您分配指针的 LHS 部分无关紧要。 这就是为什么你不需要构造函数的这种virtual机制。 有关更多信息,请参见Bjarne Stroustrup的页面。

其他注意,需要virtual析构函数,因为您使用指针来delete object。

delete bptr; // static type may not be same as dynamic type

明确表示要构造Derived的实例:

Base *bptr = new Derived();

表示如果类型class Derived ,请构造一个 object,然后请在 bptr 中存储指向该bptr的指针 所以编译器没有什么可以猜测或推断的。

将其与:

new Derived();

创建 object 的class Derived并泄漏 object。 编译器在这里也没有什么可以猜测或推断的。 这两个片段之间的唯一区别是前者存储指针而后者不存储。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM