本文主要是介绍C++面向对象-18-继承中的对象模型和继承中构造和析构顺序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前面一篇学习了继承,知道类子类虽然继承类父类的熟悉,但是不可以访问到父类的私有成员。那么我们先来讨论一个问题,子类是否继承了父类的私有成员变量呢?然后看看继承中子类的构造和父类的构造以及析构函数的执行顺序。
1.通过sizeof()函数来证明子类确实继承了父类的私有成员
直接来看下面代码
#include <iostream>
using namespace std;class Base
{public :int m_A;
protected:int m_B;
private:int m_C;
};class Sun : public Base
{
public:int m_D;
};void test01()
{cout << "Size of Sun= " << sizeof(Sun) << endl;
}int main()
{test01();system("pause");return 0;
}
运行结果得到:
结果是16,也就是四个int类型,说明子类Sun继承了父类的私有非静态成员变量m_C; 那为什么子类访问不了基类的私有成员呢,原来就是C++编译器隐藏了父类的私有成员,就是不让访问,就是这么设计的,实际上子类的确继承下来了父类的私有非静态成员变量m_C。
2.通过vs下自带一个工具来打印一个类的对象模型
这个工具是安装了VS自带的,通过输入一个命令: cl /d1 reportSingleClassLayoutXXX 类所在文件名称
2.1 在开始菜单下找到这个工具入口
然后cd到你当前工程所在文件夹,如果不是在C盘,先需要切换到其他盘符。
输入命令,例如:cl /d1 reportSingleClassLayoutSun Sun这个类所在文件的名称
这个工具很强大,第一个红圈显示这个类大小16字节,通过看第二个红圈,告示这是父类(上面单词base class)是Base,其中继承类基类的三个成员属性,包括私有m_C。
3.继承中构造函数和析构函数的执行顺序
之前学习单个类的时候,我们学习类构造函数和析构函数,并且知道了是先执行构造函数,然后执行析构函数。那么这个子类继承类父类,子类的构造和父类的构造哪个先执行,通过两个析构函数怎么执行顺序。
先看看这段代码的打印顺序,我们知道现有子类还是父类对象。
#include <iostream>
using namespace std;class Base
{public:Base(){cout << "Base类的构造函数调用了" << endl;}~Base(){cout << "Base类的析构函数调用了" << endl;}};class Sun : public Base
{
public:Sun(){cout << "Sun类的构造函数调用了" << endl;}~Sun(){cout << "Sun类的析构函数调用了" << endl;}
};void test01()
{Sun s;
}int main()
{test01();system("pause");return 0;
}
运行结果
总结:
继承中的构造和析构顺序
先执行父类构造,再构造子类
先执行子类析构,再父类析构
这篇关于C++面向对象-18-继承中的对象模型和继承中构造和析构顺序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!