- #include <iostream>
- using namespace std;
- #include<string>
-
- //继承中的对象模型
-
- class Base
- {
- public:
- int m_A;
- protected:
- int m_B;
- private:
- int m_C;
- };
-
-
- //公共继承
- class Son:public Base
- {
- int m_D;
- };
-
- //利用开发人员命令提示工具查看对象模型
- //跳转盘符→F:
- //跳转文件路径→cd 具体路径下
- //查看命令
- //cl /d1 reportSingleClassLayout查看的类名 "文件名"
-
- void test01()
- {
- //父类中所有非静态成员属性都会被子类继承下去
- //父类中私有成员属性 是被编译器给隐藏了,因此是访问不到,但是确实被继承下去了
- cout << "size of Son =" << sizeof(Son) << endl; //16个字节,父类3个int一个12个字节,字节1个int4个字节
- }
-
- int main()
- {
- test01();
-
- system("pause");
-
- return 0;
-
- }
运行结果:
① 首先打开visio studio的开发人员命令工具,如下图所示。
② 查询visio studio的项目所在地址。
③ "输入跳转盘符,例如,C:"->"输入项目所在地的地址"->"输入dir(查询项目中文件信息)"
④ 输入:cl(空格)/d1 reportSingleClassLayout查看的类名 "文件名",可以查看类所占内存空间大小。
① 继承中,先调用父类构造函数,再调用子类构造函数,析构顺序与构造顺序相反,先调用子类析构函数,再调用父类析构函数。
- #include <iostream>
- using namespace std;
- #include<string>
-
- //继承中的构造和析构顺序
-
- 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()
- {
- //Base b; //创建父类对象只有父类的构造函数、析构函数
-
- //继承中的构造和析构顺序如下:
- //先构造父类、再构造子类,析构的顺序与构造的顺序相反
- Son s;
- }
-
-
- int main()
- {
- test01();
-
- system("pause");
-
- return 0;
-
- }
运行结果:
① 子类对象可以直接访问到子类中同名成员。
② 子类对象加作用域可以访问到父类同名成员。
③ 当子类与父类拥有同名的成员函数,子类会隐藏父类中所有同名成员函数(有参、无参),加作用域才可以访问到父类中同名函数。
- #include <iostream>
- using namespace std;
- #include<string>
-
-
- //继承中同名成员处理
-
- class Base
- {
- public:
- Base()
- {
- m_A = 100;
- }
- int m_A;
-
- void func()
- {
- cout << "Base - func()调用" << endl;
- }
-
- void func(int a)
- {
- cout << "Base - func(int a)调用" << endl;
- }
- };
-
- class Son:public Base
- {
- public:
- Son()
- {
- m_A = 200;
- }
-
- void func()
- {
- cout << "Son - func()调用" << endl;
- }
-
- int m_A;
- };
-
- //同名成员属性处理方式
- void test01()
- {
- Son s;
- cout << "Son 下 m_A=" << s.m_A << endl;
- //如果通过子类对象访问到父类中同名成员,需要加作用域
- cout << "Base 下 m_A=" << s.Base::m_A << endl;
-
- }
-
- //同名成员函数处理方式
- void test02()
- {
- Son s;
- s.func(); //直接调用 调用时子类中的同名成员
-
- //调用父类中同名成员函数
- s.Base::func();
-
- //如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数
- //如果想访问到父类中被隐藏的同名成员函数,需要加作用域
- s.Base::func(100);
- }
-
- //同名成员函数处理
- int main()
- {
- test01();
- test02();
-
- system("pause");
-
- return 0;
-
- }
运行结果:
链接:https://www.zhihu.com/question/437657370/answer/1692846096