C++ 多重继承

注意:多重继承在实际开发中尽量少用,能不用就不用。多重继承很繁杂,很复杂。

多重继承就是派生类继承多个基类,继承方法和一个继承是一样的。
一个继承请看我 —> “C++ 继承和派生” 文章,会有详细介绍。
链接: C++ 继承和派生

在这里我主要讲多重继承的细节。

第一
继承方法:
例如已声明了类A、类B和类C,那么可以这样来声明派生类D:

class D: public A, private B, protected C{
    //...
};

D 是多继承形式的派生类,
D 有3个父类(基类)
它以公有的方式继承 A 类,
以私有的方式继承 B 类,
以保护的方式继承 C 类。
D 根据不同的继承方式获取 A、B、C 中的成员.

第二
派生类中的构造函数:
以上面的 A、B、C、D 类为例,D 类构造函数的写法为:

D(形参列表): A(实参列表), B(实参列表), C(实参列表){
    //...
}

注意:
如果A,B,C基类中,都包含数据成员name,那么派生类D都会将他们继承下来。
在自己的构造函数中为他们赋值的话,他们属于不同的内存,所以都可以赋值,不会起冲突。

D(const char *name): A(name), B(name), C(name) {
	//...
}

=

=

多继承的构造函数的调用顺序:
基类构造函数的调用顺序和和它们在派生类构造函数中出现的顺序无关,
而是和声明派生类时基类出现的顺序相同。

例:

class D: public A, private B, protected C{
    //...
};

调用构造函数的顺序是:A, B, C

=

=

=

补充:

多重继承的弊端: 二义性[多重继承的钻石问题]

假如基类A,B,C都有一个成员函数play(),派生类D继承他们后,同时也会把他们三个的paly()方法都继承过来。
当D类的对象去调用play()这个方法就会出错,因为编译器完全不知要调用哪个。

例:

class A {
	public:
	void play() {cout << "玩王者荣耀" << endl;}
};

class B {
	public:
	void play() {cout << "玩和平精英" << endl;}
};

class B {
	public:
	void play() {cout << "玩QQ飞车" << endl;}
};

class D : public A, public B, public C {
	public:
	//...
};
int main(void) {
	D d;
	
	d.play();		// 错误,编译器不知道该调用谁的play()方法
	
	return 0;
}

=

=

以上这种二义性的问题有两个解决方法:

第一,指明类去调用:

int main(void) {
	D d;
	
	d.A::play();
	d.B::play();	// 要使用哪个类的play()方法就指明哪个类
	d.C::play();	
	
	return 0;
}

第二,自己类中建一个:

class A {
	public:
	void play() {cout << "玩王者荣耀" << endl;}
};

class B {
	public:
	void play() {cout << "玩和平精英" << endl;}
};

class B {
	public:
	void play() {cout << "玩QQ飞车" << endl;}
};

class D : public A, public B, public C {
	public:
	void play() { 
		A::play();
		B::play();		// 需要调用谁的就写下来
		C::play();
	}
};

这样子调用,就会调用到自己定义的play()方法了,使代码更简明,简介

int main(void) {
	D d;
	
	d.play();		// 调用自己的play()方法
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值