2012-12-26 161 views
2

我想從一個接口實現純虛方法,使用具體類提供的實現 而不必顯式調用具體類的方法。例如:從具體類使用繼承來實現純虛方法C++

class InterfaceA{ 
public: 
    virtual void foo() = 0; 
}; 

class InterfaceB:public InterfaceA{ 
public: 
    virtual void bar() = 0; 
}; 

class ConcreteA : public InterfaceA{ 
public: 
    virtual void foo(){}//implements foo() from interface 
}; 

class ConcreteAB: public InterfaceB, public ConcreteA{ 
public: 
    virtual void bar(){}//implements bar() from interface 
}; 

在這種情況下,編譯器要求在類ConcreteAB FOO()的實施,因爲InterfaceB沒有它實現,它繼承了InterfaceA。

有一種方法可以告訴編譯器使用ConcreteA的實現而不使用調用ConcreteA :: foo()的包裝器?

+0

代碼似乎罰款:http://liveworkspace.org/code/2W44n2$3 – SomeWittyUsername

+0

一旦我添加了','你錯過了,這對編譯G ++ 4.5的罰款。你能告訴我們導致問題的真實代碼嗎? –

+0

我不想這樣做。我想告訴編譯器,這個實現是從ConcreteA提供的,而不使用包裝器/存根。有一種方法? –

回答

4

使InterfaceA成爲虛擬基類。

class InterfaceB : public virtual InterfaceA { 
public: 
    virtual void bar() = 0; 
}; 

class ConcreteA : public virtual InterfaceA { 
public: 
    virtual void foo(){}//implements foo() from interface 
}; 
+0

非常感謝!這是關鍵= D –

3

您需要virtual inheritance

層次結構頂部的接口A實際上應該由所有直接子類繼承。

class InterfaceB:public virtual InterfaceA{ 
public: 
    virtual void bar() = 0; 
}; 

class ConcreteA : public virtual InterfaceA{ 
public: 
    virtual void foo(){}//implements foo() from interface 
};