派生类继承基类
内存分配时,是在于基类对象不同的内存地址处,按基类的成员变量类型,开辟一个同样的类型空间,但注意开辟后派生对象的空间,不是复制基类的成员的值,而是仅仅开辟那种成员类型的空间,未初始化时,里面存在的数是不确定的。
然后派生类自己定义的成员变量是排在继承的A类成员下面,如果派生类定义的变量名与基类相同,则此变量覆盖掉继承的基类同名变量,注意,覆盖不是删除,也 就是派生类中继承自基类的成员变量依然存在,而且值也不发生变化。如果想用此继承自基类的成员变量,则要加:: , 在成员函数中访问时,直接用base::i,即可,用派生类的对象a访问时,如果此继承自基类的成员变量是对象可访问的(Public类型),则用a.base::i访问之。
Base base;
Sub_class sub;
base.i;
base.j
但是用对象访问派生类的继承自基类的成员变量时(假定public类型)
得用:
sub.Base::i
sub.Base::j
直接用sub.i, 访问的是子类自定义的i
如 以下程序
01.class base{
02.public:
03. int i;
04. int j;
05.};
06.class sub:public base{
07. public:
08. int i;
09. int j;
10. void p(){
11. cout<<base::i<<endl;
12. cout<<base::j<<endl;
13. }
14.
15.};
16.base b;
17.sub s;
18.
19.b.i=1;
20.b.j=2;
21.
22.s.i=3;
23.s.j=4;
24.
25.s.p(); // 输出两个不确定的数 4425598 4421322
26.cout<<b.i<<endl; // 1
27.cout<<b.j<<endl; // 2
28.cout<<s.i<<endl; // 3
29.cout<<s.j<<endl; // 4
30.cout<<s.base::i<<endl;
31.cout<<s.base::j<<endl;
输出结果如下
4425598
4421322
1
2
3
4
4425598
4421322
Press any key to continue . . .
从派生类对象继承的两个基类变量的值和及基类对象两个成员变量的值得比较看,足以验证上述结论:
子类继承的基类的成员,只是在另一个内存空间内开辟一个这种类型的成员变量,它的值并不是基类的值,编译器只是负责把这一部分空间类型设置为与基类的类型相同。