Effective C++(审慎的使用多重继承)


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成员变量?

  1. 多个
  2. 一个

再C++中都支持。看你如何继承。默认是有拷贝的。

虚继承

class File{};
class InputFile:virtual public File{};
class OutputFile:virtual public File{};
class IOFile:public InputFile, public OutputFile
{};

没有拷贝只有一份数据。

缺点

  1. 虚继承会导致运行速度下降。
  2. virtual bases的初始化是由它的派生类来完成的。无论派生类距离它多远。

指导原则

  1. 非必要不要使用虚继承
  2. 如果要使用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时。这种情况下你会发现多重继承较为合理。当然其他也会有各种情况可能比较合理。这些需要你自己去考虑是否使用多重继承。

总之

有单一继承的可行方案时就不要使用多重继承。使用多重继承的时候你需要三思.

发布了127 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/luixiao1220/article/details/104023957