2013-02-08 70 views
0
#include <iostream> 

class BarParent 
{ 
    virtual void fuz() 
    { 
     std::cout << "BarParent" << std::endl; 
    } 
}; 

class BarChild : public BarParent 
{ 
    virtual void fuz() 
    { 
     std::cout << "BarChild" << std::endl; 
    } 
}; 

class Foo 
{ 
// ??BarParent bar;?? 
public: 
    Foo(BarParent bar); 
}; 

我追求的是存儲副本BarParent傳遞給構造函數,讓它駐留在Foo,同時還調用正確的virtual function居住父類類型的成員在另一個類中

這是一個嵌入式應用程序:使用堆是皺眉。所以最好不堆

摘要:據所知,它不能做,監守的slicing problem的(長話短說編譯器不能確定複製它的類型轉換的通用Bar等大小),所以不能實現多態性。使用模板可能是一個好主意,但是,它定義了多個class es Foo<typename BarType>,因此,執行function(如changeBar(BarParent))將不可能,因爲編譯器會將其定義爲僅爲類Foo<Bartype>定義的changeBar(BarType)。如果有人有更好的主意,請告訴我。我想我將不得不去堆,或const Barparent和指針。如果用戶const_cast的話,那他是在惹麻煩,不是我的錯!

回答

2
class Foo 
{ 
    BarParent* bar; //or std::unique_ptr<> 
public: 
    Foo(BarParent* barInst):bar(barInst){} 
}; 

這會做你想要什麼。你存儲一個指向BarParent對象的指針,你可以使用polymorphicaly(是一個單詞嗎?)調用虛擬函數。

您需要在構造函數之外(在堆上或其他地方)創建副本,並將指針傳遞給foo對象構造函數。或者你可以實現一個克隆方法在Copying derived entities using only base class pointers, (without exhaustive testing!) - C++

一個完全不同的方法討論是使用模板 ..它會離開你foo<>類型的multidudes雖然..如果你不打算重新分配在bar對象,或存儲的所有foo在一個容器中,這可能是你更好的選擇,因爲它不涉及堆

template<typename BarType> 
class Foo 
{ 
    BarType bar; //pointer not needed any more since we are storing the exact type. 
public: 
    Foo(BarType& barInst):bar(barInst){} 
}; 
+0

它必須是一個副本,所以需要一個指針來代替。 – chris

+0

@chris ah yes .. –

+0

但是,對象BarParent可以在更高範圍內的其他別名下編輯。我不想那樣。我需要__copy__它 – aiao

0

沒有辦法,我所知道的不正常object slicing處理此。

我能想到的唯一的辦法是使用指針,營造當「通話中」的Foo構造一個副本:

class Foo 
{ 
    BarParent* bar; 

public: 
    Foo(BarParent* b) : bar(b) {} 
}; 

BarChild child; 

Foo myFoo(new BarChild(child));