2013-10-17 251 views
-1

我:繼承的對象

class A 
{ 
public: 
    A(); 
    ~A(); 
    void addClass(int id, C class); 
    C getClass(int id); 

private: 
    hash_map<int, C> map; //TEMPLATE 
}; 

假設C是一個父類。有沒有在主要方法任何方式使用方法addClassB類的一個對象,並D另一個類的對象,無論是從C類派生?當我這樣做,想盡了辦法getClass,我發現我不能夠使用特定的屬性,無論從類B或類D,只是屬性從他們的父母,C類,因爲如果他們被轉換成它們的父類。我嘗試過使用模板,但它似乎不起作用:。

編輯:只是完全沒有這個問題,我不是故意要獲得由C類A ...

+1

不要在文本中描述代碼,請將其發佈。 – Angew

+2

切片,或類似的東西? – John

+0

爲什麼要從'C'派生'A',在你的語境中對我來說沒有意義。 –

回答

2

如同它們轉化爲自己的父類

他們轉換爲其父類。你的功能addClass採用由值C類型的參數(你已經稱爲class,但如果你想它來編譯你需要另一個名字,因爲class在C++中的保留字能不能被用作參數的名稱)。

由值傳遞裝置,所述參數是您在參數表達式指定該對象的一個​​副本。該副本的類型爲C,它不知道BA

這正是因爲如果你這樣寫:

void func(int a) { std::cout << a << '\n';} 
... 
func(1.5); 

這將打印1,不1.5,因爲參數a是將價值1.5鍵入int的結果。

在你的示例代碼,可以改爲按引用傳遞參數(因爲C是一個基類的Bint不是double一個基礎,以便該選項不適用於我的代碼)。也就是說給它類型C&而不是C。這意味着該函數不會獲取副本,而是指您指定爲參數的對象。

您仍然只能在該對象上調用屬於類C接口的一部分的調用,但它至少會是BA的一個實例。不知道你爲什麼要使用BA的屬性,我不能說這是否能解決你的問題,但這是一個開始。

第二次看看你的代碼:我想addClass將複製它的參數到名爲map的容器中。同樣,這是一個副本,因此容器中的值將是C類型的對象,而不是某種派生類型的對象。這可能需要使用shared_ptr<C>unique_ptr<C>代替C爲價值型,並動態分配對象,而我又不能肯定地說。