2012-10-25 30 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")); 
相关问题