2015-06-02 30 views
3

派生填寫抽象類成員比方說,我有一個從另一個接口繼承(純抽象類)從具體的類

class BaseInterface 
{}; 

然後另外一個接口是建立在BaseInterface

class ExtendedInterface : public BaseInterface 
{}; 

現在的界面,我有一個實現BaseInterface的具體類:

class Base : public BaseInterface 
{}; 

現在,我想來實現ExtendedInterface,但是因爲我已經有了Base我想用Base來填充BaseInterface成員。例如:

class Extended : public ExtendedInterface, public Base 
{}; 

這似乎不起作用。我收到抱怨,因爲它是一個抽象類,所以我不能實例化擴展。我可以通過使用虛擬繼承來實現它,唯一的方法就是使用虛擬繼承,但是隨後我得到了關於通過支配繼承的編譯器警告。

回答

3

什麼問題?

隨着你的多重繼承,ExtendedBaseInterface繼承了兩次。這意味着,有兩個獨立的BaseInterface子對象:

  • 一個經由混凝土Base類,它已經重寫所有的純虛函數繼承。

  • 但其他經由ExtendedInterface類,這仍然是抽象的繼承。

enter image description here

結果,作爲Extended一些子對象仍然有純虛函數,類仍是不能被實例化的抽象類。

如何解決呢?

由於儘管多重繼承,你顯然希望只有一個BaseInterface,你需要使用虛擬繼承:

class BaseInterface          
{ virtual void test()=0; };        // abstract class 

class ExtendedInterface : public virtual BaseInterface // virtual inheritance 
{};              // abstract class 

class Base : public virtual BaseInterface    // virtual inheritance 
{ void test() override {} };        // concrete class 

class Extended : public ExtendedInterface, public Base // multiple 
{};        // thanks to virtual inheritance, concerete class 

有了這個邏輯,只會有一個在ExtendedBaseInterface,與虛函數重載,你可以實例化它。

這裏是一個online demo