2012-10-25 70 views
-1

首先,我是C++的新手,特別是在OOP時尚中使用C++。我有一個有多個子類的類,我想知道是否可以明確地聲明一個變量來接受一個對象,而不會限制哪些對象可以存儲在其中。我在問,因爲多個孩子中的一個最終會一次被使用。所以,如果我不能不明確地聲明一個變量,我就可以確定使用了多個變量中的哪一個。C++,是否可以聲明一個對象使用要求它是某個類?

沿

obj randomObj = new className;

,而不是

className randomObj = new className

+2

多態性;您可以使用指向基本類型的指針。 –

+1

查找繼承和多態性。 – chris

回答

0

你說你是新的C++和語法你用它來描述你想要的東西,表明你更熟悉Java或C#等其他語言。語法告訴你在這些語言的精品工程:

Foo myFoo = new DerivedFoo; 

這樣做是因爲,在Java中的場景和C#myFoo實際上表現爲一個指向富,而不是名稱能夠存儲的固定存儲區域的後面富。在C++語法Foo myFoo創建這樣一個固定的內存區域。即使你嘗試這樣做是爲了把一些派生類型有:

DerivedFoo myDerivedFoo; 
Foo myFoo = myDerivedFoo; 

myFoo仍只能容納一個Foo對象。所有不是Foo的東西在myFoo的初始化過程中被「切掉」,因爲它只是不適合固定內存區域。

所以在C++中,您必須明確執行Java和C#在幕後執行的操作通過使用C++的指針語法:

Foo *myFoo = new DerivedFoo; 

現在myFoo是一個指向一個Foo,而該指針可以指任何Foo對象,包括一個DerivedFoo的富份,沒有任何限幅或任何存在的。 new DerivedFoo創建DerivedFoo可以存在的內存區域,然後將myFoo設置爲指向創建的DerivedFooFoo部分。

0

由於所有類的公共基類派生的東西線,你可以聲明變量是基地類型,但仍可以爲其分配任何派生類,例如:

class BaseClass 
{ 
... 
}; 

class DerivedClass : public BaseClass 
{ 
... 
}; 

BaseClass *randomObj = new DerivedClass; 
0

容器只能由相同類型的對象組成。如果你想要一個異類集合,你需要在容器中粘貼一個「句柄」類型並間接訪問該對象。標準手柄類型是指針和標準的建設是std::vector<std::unique_ptr<Base>>,像這樣:

#include <memory> 
#include <utility> 
#include <vector> 

template <typename T, typename ...Args> 
std::unique_ptr<T> make_unique(Args &&... args) 
{ 
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); // or "::new" 
} 

struct Base 
{ 
    virtual ~Base() { } 
}; 

struct Derived1 : Base { /* ... */ }; 
struct Derived2 : Base { /* ... */ }; 
struct Derived3 : Base { /* ... */ }; 

std::vector<std::unique_ptr<Base>> v; 

用法:

v.push_back(make_unique<Derived1>(true, 'a')); 
v.push_back(make_unique<Derived2>(11, 22, 33)); 
v.push_back(make_unique<Derived3>("hello", "world")); 
相關問題