/*条款40:明智而审慎地使用多重继承*/
/*多重继承的缺点:1 可能导致调用歧义(相同名字的成员需显示指明)
2 钻石继承的最终子类会多份更高级基类的成员(虚继承,但会影响访问非最高基类的效率,和虚继承的来的类的体积变大)
3 最终子类需负责基类(不论直接或间接)的初始化工作
建议: 1 非必要不使用virtual base
2 如必须使用,尽可能避免在其中放置数据
*/
#include<iostream>
#include<string>
using namespace std;
class IPerson { //这个类指出需实现的接口
public:
virtual ~IPerson();
virtual string name()const = 0;
virtual string birthDate()const = 0;
};
class DataBaseID {//稍后被使用,细节不重要
};
class PersonInfo {//这个类有若干有用的函数,可用以实现IPerson接口
public:
explicit PersonInfo(DataBaseID pid);
virtual ~PersonInfo();
virtual const char *theName()const/*cstring*/ {
//vaueDelimOpen/close...
}
virtual const char*theBirthDate()const;
virtual const char*valueDelimOpen()const;
virtual const char *valueDelimClose()const;
//..
};
class CPerson :public IPerson, private PersonInfo {
public:
explicit CPerson(DataBaseID pid):PersonInfo(pid){}
virtual string name()const {//c++ string
return PersonInfo::theName();//c string
}
virtual string birthDate()const {
return PersonInfo::theBirthDate();
}//当其中一个情节涉及"public继承某个interface class"和"private继承某个协助实现的class"的两相组合
private:
const char *valueDelimOpen()const {//重新定义继承而来的虚界限函数
return "";
}
const char *valueDelimClose()const {
return "";
}
};
int main(){
system("pause");
return 0;
}