心得:
1、当基类中声明有缺省的构造函数或未声明的构造函数时,派生类的构造函数不可以向基类的构造函数传递参数,也可以不声明,构造派生类对象时调用基类的缺省的构造函数
2、当需要执行基类中带形参的构造函数来初始化基类数据时,派生类构造函数应在初始化列表中为基类构造函数提供参数。
3、作用域操作符(::)限定标识符,当派生类与基类有相同成员时:同名屏蔽************解决方法:
(1)、当派生类与基类有相同成员时,若未特别限定,则通过派生类的对象使用派生类的同名函数。
(2)、当派生类与基类有相同成员时,如果通过派生类的对象访问基类中隐藏的同名成员,应使用基类名和作用域操作符(::)来限定。
4、虚基类解决的问题:***********二义性(如果通过一个表达式能引用的成员不止一个),冗杂,冗杂导致的不一致性。
虚基类的引用:
应用于有共同基类的场合
声明:
以virtual修饰虚基类 class Derived:vityual public Base
虚基类的作用(从不同的路径继承过来的同名数据成员在内存中只有一个副本,同一个函数名也只有一个映射。):
(1)、主要用于解决虚基类多继承时可能发生的对同一基类继承多次而产生的二义性问题。
(2)、为最远的派生类提供唯一的基类成员,而不是重复多次拷贝。
注意:在第一继承时要将共同基类设计为虚基类。
设置虚基类后的程序:
#include<iostream>
using namespace std;
class Base0
{
public:
int var0;
void fun0()
{
cout<<"Member of Base0"<<endl;
}
};
class Base1:virtual public Base0
{
public:
int var1;
};
class Base2:virtual public Base0
{
public:
int var2;
};
class Derived:public Base1,public Base2
{
public:
int var;
void fun()
{
cout<<"Member of Derived"<<endl;
}
};
int main()
{
Derived d;
d.var0=0;
d.fun0();
return 0;
}
运行结果:
Member of Base0
Process returned 0 (0x0) execution time : 0.827 s
Press any key to continue.
5、有虚基类时的构造函数:
(1)、建立对象时所指定的类为最(远)派生类。
(2)、虚基类的成员是由最派生类的构造函数调用虚基类的构造函数进行初始化的。
(3)、在整个继承结构中,直接或间接继承虚基类中所有的派生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用。如果未列出,则表示调用该虚基类的默认构造函数。
(4)、在建立对象时,只有最派生类的构造函数调用虚基类的构造函数,该派生类的其他基类对虚基类的构造函数调用被忽视。
对应的程序:
#include<iostream>
using namespace std;
class Base0
{
public:
Base0(int var):var0(var){}
int var0;
void fun0()
{
cout<<"Member of Base0"<<endl;
}
};
class Base1:virtual public Base0
{
public:
Base1(int var):Base0(var){}
int var1;
};
class Base2:virtual public Base0
{
public:
Base2(int var):Base0(var){}
int var2;
};
class Derived:public Base1,public Base2
{
public:
Derived(int var):Base0(var),Base1(var),Base2(var){}
int var;
void fun()
{
cout<<"Member of Derived"<<endl;
}
};
int main()
{
Derived d(1);
d.var0=2;
d.fun0();
return 0;
}
运行结果:
Member of Base0
Process returned 0 (0x0) execution time : 0.748 s
Press any key to continue.