2012-05-15 48 views
2

我遇到了在C++中分配運行時指針的問題。我有一個 base類與2成員線程和線程。在C++中使用指針的運行時多態性

class base { 

    struct base_struct { 
     int a; 
    }; 
    base_struct thread; 
    std::vector<base_struct> threads; 

    void fn() {} 

}; 

derived1base衍生並具有相同的兩個成員(threadthreads),但不同的類型。

class derived1 : public base { 
    struct derived_struct11 : public base_struct { 
     int b; 
    }; 
    derived_struct11 thread; 
    std::vector<derived_struct11> threads; 

    void fn() { 
     printf(); 
    } 

}; 

derived2也從base衍生並具有相同的兩個成員(threadthreads),但不同的類型。

class derived2 : public base { 
    struct derived_struct22 : public base_struct { 
     int c; 
    }; 
    derived_struct22 thread; 
    std::vector<derived_struct22> threads; 

    void fn() { 
     printf(); 
    } 

}; 

只有在運行時我可以知道derived1derived2是否應使用。所以,我 做到了以下列方式:

base base_obj; 
derived1 derived1_obj; 
derived2 derived2_obj; 

base *ptr ; 

在運行時函數:

{ 
    if (condition == yes) 
     ptr = &derived1_obj; 

    else 
     ptr = &derived2_obj; 
} 

問題是,我可以this指針coreectly訪問功能。但 線程(例如值:。threads.size()始終顯示爲的base

我想知道一些更好的方法來實現這個

+2

這甚至不應該編譯,因爲'基地:: base_struct'是'private'。 –

+0

這只是一個樣本:) – deeps8us

+3

這是一個不好的樣本。發佈*正確*代碼非常重要。這使得幫助**更容易。 –

回答

2

的直接問題是,數據成員不能是虛擬的,所以你不能在派生類中覆蓋threads。一種解決方案可能是在基類中只有一個threads,並在其中存儲所有結構實例。 切片:您按值存儲對象s在std::vector<base_struct>。這意味着無論何時將對象放入它中,它都將使用base_struct的(生成的)複製構造函數複製到矢量中。這意味着原始對象的派生部分將被切掉,並且您將僅獲得base_struct元素。

要啓用多態性你應該只指針存儲base_struct在您的載體:

std::vector<base_struct*> threads; 

另一種方法是爲threads提供一個虛擬的吸氣,然後你就可以在派生類中重寫,以返回所需的集合。但是,在類層次結構中有幾個具有相同名稱的數據成員是IMO不是一個好主意。它會混淆人並導致微妙的錯誤。所以我寧願選擇第一種解決方案,除非在每個班級中保留一個單獨的集合。

+0

謝謝你們..我確實有特殊的理由讓這兩個班裏的同一名成員。將嘗試其他解決方案。 – deeps8us

0

一種方法周圍是

base_struct* thread; 
std::vector<base_struct*> threads; // <- hmmmmmmm 

然後在你的派生類,設置適當的基體(而不是在派生類中定義了兩個新成員 - 我認爲這是不是你在找什麼呢)