本节条款讲述了多重继承的使用
多重继承一般情况下用的很少,原因在于多重继承容易出现程序错误。以下去两个典型的调用错误:
第一种错误如下代码:
#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 "";}
};
时间: 2024-10-14 18:22:48