C++零碎记录(十)

17. 继承对象内存

17.1 查询继承对象所占内存

#include 
using namespace std;
#include

//继承中的对象模型

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的开发人员命令工具,如下图所示。

C++零碎记录(十)_第1张图片

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

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

C++零碎记录(十)_第2张图片

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

C++零碎记录(十)_第3张图片

18. 继承构造和析构顺序

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

#include 
using namespace std;
#include

//继承中的构造和析构顺序

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 
using namespace std;
#include


//继承中同名成员处理

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
 

你可能感兴趣的:(C++学习记录,c++,开发语言)