首先,我是C++的新手,特別是在OOP時尚中使用C++。我有一個有多個子類的類,我想知道是否可以明確地聲明一個變量來接受一個對象,而不會限制哪些對象可以存儲在其中。我在問,因爲多個孩子中的一個最終會一次被使用。所以,如果我不能不明確地聲明一個變量,我就可以確定使用了多個變量中的哪一個。C++,是否可以聲明一個對象使用要求它是某個類?
沿
obj randomObj = new className;
,而不是
className randomObj = new className
首先,我是C++的新手,特別是在OOP時尚中使用C++。我有一個有多個子類的類,我想知道是否可以明確地聲明一個變量來接受一個對象,而不會限制哪些對象可以存儲在其中。我在問,因爲多個孩子中的一個最終會一次被使用。所以,如果我不能不明確地聲明一個變量,我就可以確定使用了多個變量中的哪一個。C++,是否可以聲明一個對象使用要求它是某個類?
沿
obj randomObj = new className;
,而不是
className randomObj = new className
你說你是新的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
設置爲指向創建的DerivedFoo
的Foo
部分。
由於所有類的公共基類派生的東西線,你可以聲明變量是基地類型,但仍可以爲其分配任何派生類,例如:
class BaseClass
{
...
};
class DerivedClass : public BaseClass
{
...
};
BaseClass *randomObj = new DerivedClass;
容器只能由相同類型的對象組成。如果你想要一個異類集合,你需要在容器中粘貼一個「句柄」類型並間接訪問該對象。標準手柄類型是指針和標準的建設是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"));
多態性;您可以使用指向基本類型的指針。 –
查找繼承和多態性。 – chris