author:
- luixiao1223
title: 审慎的使用多重继承
坏处
class BorrowableItem{
public:
void checkOut();
};
class ElectronicGadget{
private:
bool checkOut() const;
};
class MP3Player:public BorrowableItem,public ElectronicGadget
{};
MP3Player mp;
mp.checkOut(); //编译器会报错,歧义
需要明确指出调用哪个
mp.BorrowableItem::checkOut();
钻石形继承
class File{};
class InputFile:public File{};
class OutputFile:public File{};
class IOFile:public InputFile, public OutputFile
{};
最后的IOFile含有多少个File中的数据比如filename成员变量?
- 多个
- 一个
再C++中都支持。看你如何继承。默认是有拷贝的。
虚继承
class File{};
class InputFile:virtual public File{};
class OutputFile:virtual public File{};
class IOFile:public InputFile, public OutputFile
{};
没有拷贝只有一份数据。
缺点
- 虚继承会导致运行速度下降。
- virtual bases的初始化是由它的派生类来完成的。无论派生类距离它多远。
指导原则
- 非必要不要使用虚继承
- 如果要使用virtual
bases,尽量不要再里面放置数据。这样就不用担心他们初始化时候的诡异状况了。
有时候可以使用多重继承
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* 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 std::string name() const
{return PersonInfo::theName();}
virtual std::string birthDate() const
{return PersonInfo::theBirthDate();}
private:
const char* valueDelimOpen() const {return "";}
const char* valueDelimClose() const{return "";}
};
当你需要public继承某个interface
class和private继承某个协助实现的class时。这种情况下你会发现多重继承较为合理。当然其他也会有各种情况可能比较合理。这些需要你自己去考虑是否使用多重继承。
总之
有单一继承的可行方案时就不要使用多重继承。使用多重继承的时候你需要三思.