虚继承中的内存布局

Posted Key_Ky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚继承中的内存布局相关的知识,希望对你有一定的参考价值。

直接看例子就好:

#include "qdatetime.h"

class Person {
public:
    Person(QString name, QDate birthdate)
    QObject(name.ascii()),
    m_Birthdate(birthdate) {}

    Person(const Person& p) : QObject(p),
    m_Birthdate(p.m_Birthdate) {}

private:
    QDate m_Birthdate;
};

class Student : virtual public Person {       1
    // other class members
};

class Teacher : virtual public Person {       2
    // other class members
}


class GraduateTeachingFellow :
    public Student, public Teacher {          3
public:
    GraduateTeachingFellow(const Person& p,
                           const Student& s, const Teacher& t):
    Person(p), Students(s), Teacher(t) {}     4

技术分享

Note keyword virtual here.

技术分享

virtual inheritance.

技术分享

virtual not needed here.

技术分享

It is necessary to initialize all virtual base classes explicitly in multiply-derived classes, to resolve ambiguity about how they should be initialized.

Each instance of a class that virtually inherits from another has a pointer (or a variable offset) to its virtual base class subobject. 看来这里每个虚继承类的实例代表的是Student和Teacher都会有一个指针指向虚基类的 virtual base class subobject。具体这里怎么翻译还得查查

技术分享

 

以上是关于虚继承中的内存布局的主要内容,如果未能解决你的问题,请参考以下文章

虚继承中的内存布局

虚继承之单继承的内存布局(VC在编译时会把vfptr放到类的头部,这和Delphi完全一致)

一文详解C++类的内存布局和虚函数底层实现机制

c++头脑风暴-多态虚继承多重继承内存布局

C++拾遗 从内存布局看C++虚继承的实现原理

C++拾遗 从内存布局看C++虚继承的实现原理