多重继承详解

一,概念:指的是在继承关系中,继承的父类不止一个。至多可以继承几个父类在c++中没有明确的定义。

class  Grand
{
public:
       int a;
};
class A: public Grand
{
public:
void fun(){}
       
};
class A2
{
public:
void fun(){}
};
class C :public A, public A2 //多重继承
{
public:
};

在这个例子中如果A2和A有相同的函数,那么定义类C对象时,调用该函数要加上作用域运算符,否则,系统不知道调用的是A还是A2中的函数。
即:多重继承的二义性问题。
C obj;
obj A::fun();
当然,如果类C中含有fun()函数,那么类A和A2的fun()函数将被遮蔽,因此,此时调用的将是类c中的fun()函数。

多重继承之间的关系:
在这里插入图片描述
在这里插入图片描述
二:静态成员在多重继承中的可见问题

class  Grand
{
public:
       static int a;
};
int Grand::a = 10;//类外定义
class A: public Grand
{
public:
       
};
class A2
{
public:
};
class C :public A, public A2
{
public:
};
int main()
{
       C c;
       
       //可以
       C::a = 10;
       A::a = 1;
       C::a = 9;
       c.a = 8;
       A2::a = 3;//不可以
}

三:派生类构造函数与析构函数
主要是调用顺序问题,这里可以自己写代码看看调用顺序。

四:继承的构造函数。

在继承体系中,子类可以继承父类的构造函数,但是,默认构造函数,拷贝构造函数,移动构造函数是不能被继承的。

class B1
{
public:
       B1(int i, int j) { cout << "dad" << endl; }
       B1(){ }
       B1(int i, int j, int k, int n, int m=10){ }
};
class B2 :public B1
{
public:
       using B1::B1;//继承B1中出现的构造函数
};
int main()
{
     B2 b(1,2);
     B2 b1;
     B2(1, 2, 3, 4, 5);
     B2(1, 2, 3, 4);
}

这里:using B1::B1;相当于
B2(int i,int j):B1(i,j){ }
B2(int i, int j,int k,int n) :B1(i,j,k,n) { }
B2(int i, int j, int k, int n,int m) :B1(i, j, k, n,m) { }
B2(){ }

即,在派生类中都会构造出一个与之相同形参列表的构造函数。

五:从多个父类继承构造函数

class D1
{
public:
       D1(int i, int j) { cout << "D1(int i, int j)" << endl; }
};
class D2
{
public:
       D2(int a) { cout << "D2(int a)" << endl; }
       D2() { }
};
class D3:public D1,public D2
{
public:
       using D1::D1;   //D3(int i,int j):D1(i,j) { }
       using D2::D2;   //D3(int a):D2(a) { }
};
int main()
{
       D3 obj(1,2);  
}

如果在多继承的派生类中,它从基类继承来的构造函数中,有相同形参列表的构造函数,那么,派生类必须重写这个版本的构造函数。

class D1
{
public:
       D1(int i) { cout << "D1(int i)" << endl; }
};
class D2
{
public:
       D2(int a) { cout << "D2(int a)" << endl; }
};
class D3:public D1,public D2
{
public:
       using D1::D1;   
       using D2::D2;  
       D3(int i):D1(i),D2(i) { } //重写构造函数
};
int main()
{
       D3 obj(1);    
}

因为, using D1::D1;   //D3(int i):D1(i) { }
      using D2::D2;   //D3(int a):D2(a) { }
这样的话,就相当于有相同形参个数的构造函数了
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值