本篇是基于上一篇的内容继续来学习继承,没看过上一篇的朋友,请点击下方
先看下方两个类
class Father
{
public:
int age;
};
class Son : public Father
{
};
有了继承关系后,Son中虽然没有int age,但依然可以访问到age,如下
Son son;
son.age = 20;
cout << son.age << endl;
那么现在,就来思考一个问题,为什么son可以访问到Father类中的age变量的呢?
为了能更加容易的理解这个问题,我们需要借助一个工具:vs2013开发人员命令提示.exe,如下
打开该工具后,在命令行里输入如下命令
cl /d1 reportSingleClassLayout类名+类所在的文件名
该命令的作用是用于查看某个类,在经过编译器编译之后,该类的结构成什么样了。
现在就来实践一下
如下,当前Son类,是定义在test.cpp里的
现在在vs2013开发人员命令提示.exe中输入如下,用于查看Son类在被编译器编译之后的结构。
cl /d1 reportSingleClassLayoutSon test.cpp
回车之后,将打印如下内容
可以发现,在编译之后,编译器会在Son类里添加1个age属性,相当于是编译器从Father中将age又复制了一份到Son里,只有这样,我们才可以通过Son对象访问到age变量。
假如,此时我在Son里又加一个age变量,如下
class Son : public Father
{
public:
int age;
};
那么在编译器编译之后,Son的类结构又会变成什么样呢?
输入命令:
cl /d1 reportSingleClassLayoutSon test.cpp
打印结果如下
可以发现,在编译之后,Son里有2个age变量,base class Father 下面的age,表示该age是从Father中拷贝的,另一个age,是Son自己定义的。
由这里,你可以发现,在编程语言里,继承的本质就是拷贝,就是将父类中的属性,拷贝一份到子类里。
那么现在我想给父类中的age变量赋值,可以通过如下代码
Son son;
son.Father::age = 20;
cout << son.Father::age << endl;
假如想给Son的age变量赋值,就通过如下代码
Son son;
son.age = 200;
cout << son.age << endl;