2012-02-27 148 views
0

它的確定,具有共享功能

class A 
{ 
    virtual x() = 0; 
    virtual y() = 0; 
} 

class B 
{ 
    virtual x() = 0; 
    virtual z() = 0; 
} 

class C : A , B 
{ 
    x(); 
    y(); 
    z(); 
} 

與兩個庫,其一個僅知道A和另一個的共享類C的實例只知道B?

像:

庫1:

#include <a> 

A* a = function_in_the_core_that_creates_a_C_and_retrieves_it(); 
a->x(); 
a->y(); 

庫1:

#include <b> 

B* b = function_in_the_core_that_creates_a_C_and_retrieves_it(); 
b->x(); 
b->z(); 

我問這個,因爲我不知道如果編譯器都會有問題要解決,因爲該功能圖書館沒有C的祖先的全部知識。

編輯:

function_in_the_core_that_creates_a_C_and_retrieves_it()應該返回一個C *不是C.我認爲這是明顯的,因爲我們正在談論虛函數。

回答

1

你真的應該讓代碼編譯。 C私下繼承A和B,所以這個例子不會運行。 class C : public A , public BC的更正聲明。你也缺少函數的返回類型。

要麼function_in_the_core_that_creates_a_C_and_retrieves_it會返回一個B*,然後將順應B充分血統和工作的B對所有意圖和目的 - 或者它會返回一個C*,在這種情況下,你必須提供一個完整的聲明的C爲了賦值工作沒有明確的演員。你不能只有C宣佈這樣做。

所以,你要麼返回一個指針B在這種情況下沒有問題 - 或指向C,您將需要提供完整的祖先爲了使分配沒有潛在危險的演員。

+0

當我說:「共享類C的實例」,我的意思是返回一個C *。我的問題是,如果由核心返回一個C *,每個庫都會找到他們想要的函數,因爲他們對C沒有任何瞭解。 – user246100 2012-02-27 13:05:11

+0

這是行不通的。你需要提供'C'的完整定義才能返回一個指針。如果你返回一個只是向前聲明的'C *',它將不會運行,並且你將無法安全地將它轉換爲'A'或'B'。它或者是一個'C'實現,或者是寫兩個函數分別返回'A'或'B'。 – Dervall 2012-02-27 13:09:49

+0

要清楚的是,如果您提供'C'的前向聲明或完整聲明,則只能返回指向'C'的指針。前向聲明將轉換爲B或A是非法的。 – Dervall 2012-02-27 13:12:16

1

現在,沒有。你在這兩種情況下都調用相同的函數。唯一可行的方法是返回C*。如果知道C的定義(並且還需要繼承是公共的),才能轉換爲A*B*

如果你有兩個獨立的功能,一個返回A*和一個返回B*,那就沒事了。每個基類子對象都包含足夠的信息,以便虛擬調度和RTTI正常工作,而無需瞭解對象的動態類型。

+0

X應該是相同的功能。我的問題是,通過核心傳遞一個C *,每個庫都會找到他們想要的函數,因爲他們對C沒有任何瞭解。 – user246100 2012-02-27 13:03:35

+0

@ user246100:在這種情況下,我的第一段回答你的問題 - 沒有定義的'C'(和公共繼承),函數結果不能轉換爲指向任何一個基類的指針。 – 2012-02-27 13:09:32