2012-08-12 74 views
1

我希望你能幫助我解決以下問題。 我正在嘗試創建一個靈活的接口系統並遇到問題。 這是相關代碼:定義多個衍生接口成員

// Interface 1 
//  this: virtual f_a 
// -> abstract 
struct I_A abstract 
{ 
    virtual void f_a() = 0; 
}; 

// Interface 2 
//  I_A : virtual f_a 
//  this: virtual f_b 
// -> abstract 
struct I_B abstract : public I_A 
{ 
    virtual void f_b() = 0; 
}; 

// Implementation 1 
//  I_A : virtual f_a 
//  zhis: defines f_a 
// -> not abstract 
struct S_A : public I_A 
{ 
    virtual void f_a() {} 
}; 

// Implementation 2 
//  I_B : virtual f_a 
//  I_B : virtual f_b 
//  S_A : defines f_a 
//  this: defines f_b 
// -> not abstract 
struct S_B : public I_B, public S_A 
{ 
    virtual void f_b() {} 
}; 

因爲編譯器指出它是抽象的,我不能實例S_B。 有什麼不對?

+0

可能的重複http://stackoverflow.com/questions/11662890/inherit-from-multiple-partial-implementations-of-an-abstract-base-class/11662963#11662963 – juanchopanza 2012-08-12 10:55:21

回答

0

您需要使用這裏虛繼承:

struct I_A 
{ 
    virtual void f_a() = 0; 
}; 

struct I_B : virtual public I_A 
{ 
    virtual void f_b() = 0; 
}; 


struct S_A : virtual public I_A 
{ 
    virtual void f_a() {} 
}; 

注1:我忽略了類聲明的abstract語句,因爲它不是標準的C++。

注2:有這個here的副本,您可以在這裏找到有關發生這種情況的解釋。

+0

謝謝! 我現在可以編譯的代碼,但我得到警告C4250:通過主導地位繼承「S_A :: S_A :: F_A」 是什麼意思,我能做些什麼: 警告C4250:「S_B」? – 2012-08-12 11:30:55

+0

@BetaCarotin我猜這是告訴你你有鑽石繼承,它告訴你你從'S_A'得到'f_a'的位置。但是我不使用VS,而gcc也沒有給我任何警告。 – juanchopanza 2012-08-12 11:35:15

+0

好吧,我想我會忽略它。感謝您的幫助! – 2012-08-12 12:19:22