C++零碎记录(十)

17. 继承对象内存

17.1 查询继承对象所占内存

复制代码
#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;

}

运行结果:

  • size of Son =16
  • 请按任意键继续. . .

17.2 VS自带开发工具查询

① 首先打开visio studio的开发人员命令工具,如下图所示。

② 查询visio studio的项目所在地址。

③ "输入跳转盘符,例如,C:"->"输入项目所在地的地址"->"输入dir(查询项目中文件信息)"

④ 输入:cl(空格)/d1 reportSingleClassLayout查看的类名 "文件名",可以查看类所占内存空间大小。

18. 继承构造和析构顺序

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

复制代码
#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;

}

运行结果:

  • Base构造函数!
  • Son构造函数!
  • Son析构函数!
  • Base析构函数!
  • 请按任意键继续. . .

19. 同名成员处理

① 子类对象可以直接访问到子类中同名成员。

② 子类对象加作用域可以访问到父类同名成员。

③ 当子类与父类拥有同名的成员函数,子类会隐藏父类中所有同名成员函数(有参、无参),加作用域才可以访问到父类中同名函数。

复制代码
#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;

}

运行结果:

  • Son 下 m_A=200
  • Base 下 m_A=100
  • Son - func()调用
  • Base - func()调用
  • Base - func(int a)调用
  • 请按任意键继续. . .

链接:https://www.zhihu.com/question/437657370/answer/1692846096

相关推荐
誰能久伴不乏1 分钟前
Qt 动态属性(Dynamic Property)详解
开发语言·qt
枫叶丹441 分钟前
【Qt开发】常用控件(四)
开发语言·qt
草莓熊Lotso1 小时前
《吃透 C++ 类和对象(中):const 成员函数与取地址运算符重载解析》
c语言·开发语言·c++·笔记·其他
weixin_307779131 小时前
VS Code配置MinGW64编译Ipopt库
开发语言·c++·vscode·算法
Tadas-Gao1 小时前
Java设计模式全景解析:从演进历程到创新实践
java·开发语言·微服务·设计模式·云原生·架构·系统架构
anlogic2 小时前
Java基础 8.16
java·开发语言
蚰蜒螟3 小时前
Netty 的 Select/Poll 机制核心实现主要在 NioEventLoop 的事件循环
java·开发语言
野生的编程萌新3 小时前
从冒泡到快速排序:探索经典排序算法的奥秘(二)
c语言·开发语言·数据结构·c++·算法·排序算法
Full Stack Developme3 小时前
Java后台生成多个Excel并用Zip打包下载
java·开发语言·excel
Brookty3 小时前
【Java学习】锁、线程死锁、线程安全2
java·开发语言·学习·java-ee