本文主要是介绍Effective C++条款40,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本节条款讲述了多重继承的使用
多重继承一般情况下用的很少,原因在于多重继承容易出现程序错误。以下去两个典型的调用错误:
第一种错误如下代码:
#include<iostream>
using namespace std;class B
{
public:virtual int m(){}
};class C
{
public:virtual int m(){};
};class D :public B,private C
{
public:};int main()
{D d;d.m();//编译不通过,因为m()调用不明确return 0;}
如上代码,由于B类中有个m()函数,C类中也有个m()函数,D同时继承B和D的m()函数,所以在调用的时候无法确定调用哪个。虽然D继承C是private方式,D无法调用C的m()函数,可是函数匹配在函数可调用性之前处理,两个类的m()函数都是最佳匹配,所以系统无法取舍调用哪个函数。
第二种错误代码:
如下:
class A
{
public:int m;
};class B:public A
{
public:
};class C :public A
{
public:
};class D :public B,private C
{
public:
};
如上代码,B和C同时继承自A,D又继承自B和C,所以,对于A中的数据,D中都会出现两份。比如int m,为了预防这种事情发生,可对继承关系添加virtual关键字避免。
如下代码:
#include<iostream>
using namespace std;
class A
{
public:
};class B:virtual public A
{
public:virtual int m(){}
};class C :virtual public A
{
public:virtual int m(){};
};class D :public B,private C
{
public:
};
并且运用virtual关键字对程序而言会出现副作用,副作用是
1.使用virtual继承的对象比non-virtual继承的对象体积大
2。访问virtual base classes成员变量比访问non-virtual base classes成员变量速度慢。
使用多重继承在有些时候却是合适的,这样可以提高程序的复用率,看一下书上的例子:
class IPerson{public:virtual ~IPerson();virtual std::string name() const=0;virtual std::string birthDate() const=0;};class DatabaseID{……};class PersonInfo{public:explicit PersonInfo(DatabaseID pid);virtual ~PersonInfo();virtual const char* theName() const;virtual const char* theBirthdayDate() const;……private:virtual const char* valueDelimOpen() const;virtual const char* valueDelimClose() const;……};class CPerson: public IPerson, private PersonInfo{public:explicit CPerson(DatabaseID pid): PersonInfo(pid){}virtual std::string name() const{return PersonInfo::theName();}virtual std::string birthDate(){return PersonInfo::theBirthDate();}private:const char* valueDelimOpen() const{return "";}const char* valueDelimClose() const{return "";}};
这篇关于Effective C++条款40的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!