c++ - 多重继承和指针实现

标签 c++

给定以下代码:

namespace Example1 {

class A {
public:
    A() {}
    virtual ~A() {}
private:
    float data_A;
};

class B {
public:
    B() {}
    virtual ~B() {}
protected:
    float data_B;
};

class Derived : public A, public B {
public:
    Derived() {}
    virtual ~Derived() {}
protected:
    float data_Derived;
};

}

int main (void)
{
using namespace Example1;
B* pb = new Derived;
delete pb;
}

pb 现在应该指向 Derived 对象的 B 部分。 但是派生对象也派生自 A,意味着它有 A 子对象..并且 A 子对象应该是“第一个”因为 Derived 类首先继承自 A

编译器如何批准它?它添加了什么以使其正常工作?

还有,删除对象时如何正确释放内存?

最佳答案

简短的回答是:靠魔法。

中等答案是:这不是让您担心的。标准说这是可行的,并且由编译器找出使其工作的方法。

长答案:因为这取决于您的编译器,请阅读编译器的文档!许多 C++ 编译器都实现了 Itanium C++ ABI,所以这是一个开始。作为多态继承的一部分,每个类通常都有一个所谓的vtable,它存储了一堆函数指针,但它也存储了RTTI信息并加入了虚拟销毁和内存释放逻辑。想一想:delete pb; 不仅必须以正确的顺序调用正确的析构函数,而且还必须将正确的 指针传递给释放函数。所有这些信息都包含在类层次结构的各种 vtable 中。

关于c++ - 多重继承和指针实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16185945/

相关文章:

c++ - VS2010智能感知问题

c++ - 来自另一个非静态的非静态成员初始值设定项

c++ - 如何优化从半精度 float16 到单精度 float32 的转换?

c++ - 预期的 C++ 虚函数未被调用

c++ - 声明具有特定大小并插入元素的 vector<vector<pair<int, int>>?

c++ - 在 .vimrc 中执行映射命令后 vim 不会暂停

c++ - "Undefined"C++类成员引用

c++ - 访问作为类 vector 元素的对象的成员函数

C++ 可变参数模板在虚拟抽象的外部未解析

c++ - 基于策略的设计中的模糊继承