0630第五讲继承(4)抽象基类、纯虚函数、多继承
1、抽象基类与纯虚函数
1.1抽象基类:如果包含纯虚函数、此类是一个抽象类,因为抽象类不能实例化对象,只能用做基类使用->(抽象基类)
1.2纯虚函数:函数声明时=0,此函数是一个纯虚函数。
(纯虚函数被定义在派生类中。如果派生类不重写基类的纯虚函数,则将纯虚函数继承为派生类的纯虚函数。因此,派生类也是一个抽象类。)
2、多继承
2.1多继承:一个子类有两个或者两个以上的父类
父类构造函数的执行顺序时根据继承顺序来的
2.2主要存在问题:
多继承问题1:父类构造函数执行顺序:根据继承顺序来执行
多继承问题2:多个父类中同名函数区分:类型::来区分同名函数
多继承问题3:菱形继承问题(孙子类中出现多份爷爷类中的成员)
使用virtual继承(孙子类直接从爷爷类继承成员,再分别继承父类中各自扩展的成员)
孙子类构造函数:先调用‘爷爷’类构造函数,再各个调用父类构造函数,最后构造‘孙子’类扩展成员
class R{
protected:
int r;
public:
R(int _r):r(_r){
}
void print(){
cout<<"r = "<<r<<endl;
}
};
class A:virtual public R{
protected:
int a;
public:
A(int _r,int _a):R(_r),a(_a){
}
};
class B:public virtual R {
protected:
int b;
public:
B(int _r,int _b):R(_r),b(_b){
}
};
class C:public A,public B{
public:
// C(int _r,int _a,int _b):A(_r,_a),B(_r,_b){}//正常继承构造函数
C(int _r,int _a,int _b):R(_r),A(_r,_a),B(_r,_b){}// 虚继承构造函数
};
int main(int argc, const char * argv[]) {
C c(1,2,3);
c.print();
return 0;
}