C++继承中的对象模型与继承中构造和析构顺序

134 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

继承中的对象模型

问题: 从父类继承过来的成员,哪些属于子类对象中?

示例:

class Base
{
public:
    int m_A;
protected:
    int m_B;
private:
    int m_C; //私有成员只是被隐藏了,但是还是会继承下去
};
​
//公共继承
class Son :public Base
{
public:
    int m_D;
};
​
void test01()
{
    cout << "sizeof Son = " << sizeof(Son) << endl;
}
​
int main() {
​
    test01();
​
    system("pause");
​
    return 0;
}

利用工具查看:Visual Studio 的开发人员命令提示符

打开工具窗口后,定位到当前CPP文件的盘符

然后输入: cl /d1 reportSingleClassLayout查看的类名 所属文件名

效果如下图:

结论: 父类中私有成员也是被子类继承下去了,只是由编译器给隐藏后访问不到

继承中构造和析构顺序

子类继承父类后,当创建子类对象,也会调用父类的构造函数

问题:父类和子类的构造和析构顺序是谁先谁后?

示例:

class Base 
{
public:
    Base()
    {
        cout << "Base构造函数!" << endl;
    }
    ~Base()
    {
        cout << "Base析构函数!" << endl;
    }
};
​
class Son : public Base
{
public:
    Son()
    {
        cout << "Son构造函数!" << endl;
    }
    ~Son()
    {
        cout << "Son析构函数!" << endl;
    }
​
};
​
​
void test01()
{
    //继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反
    Son s;
}
​
int main() {
​
    test01();
​
    system("pause");
​
    return 0;
}

速记:构造时现有父亲后又儿子,析构顺序相反(白发送黑发)

总结:继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反

\