《Effective C++》条款40

明智而审慎地使用多重继承

如何看待多重继承?

class A
{
public:
	void test();
};
class B
{
public:
	int test();
};
class C :public A, public B
{};
int main()
{
	C c;
	c.test(); // 不明确
}

可能会产生歧义,调用不明确。

为了解决,你可以这样:

c.A::test();

菱形继承的问题如何解决? 

利用虚继承即可:

class A
{};
class B:virtual public A
{};
class C :virtual public A
{};
class D :public B, public C
{};
virtual继承的缺点:

使用virtual继承的那些classes所产生的对象往往比使用non-virtual继承的兄弟们体积大,访问virtual base classes的成员变量时,也比访问non-virtual base classes的成员变量速度慢。

所以,尽量别使用virtual继承,或者不要在virtual base classes中放数据,这样就不用担心这些classes身上的初始化和赋值所带来的诡异事情了。因为当一个新的derived class加入继承体系中,他必须承担其virtual bases的初始化责任。

多继承的用途:

当出现将“public继承自某接口”和“将private继承自某实现”结合在一起时。

总结:

1.多重继承比单一继承复杂。可能导致二义性,以及对virtual继承的需要。

2.virtual继承会增加大小、速度、初始化和赋值复杂度等等成本。如果virtual base classes不带任何数据,是个不错的情况。

3.多重继承的确有正当用途。 

你可能感兴趣的:(Effective,C++,c++)