C ++,是否可以声明一个对象使用它要求它是某个类?

时间:2012-10-25 23:12:27

标签: c++ oop object

首先,我是C ++的新手,尤其是以OOP方式使用C ++。我有一个有多个子类的类,我想知道我是否可以模糊地声明一个变量来接受一个对象而不限制哪些对象可以存储在其中。我问,因为多个孩子中的一个最终会被一次性使用。因此,如果我不能模糊地声明变量,我就可以确定哪些变量正在使用中。

的内容

obj randomObj = new className;

而不是

className randomObj = new className

3 个答案:

答案 0 :(得分:0)

由于所有类都派生自一个公共基类,您可以将您的变量声明为该基类类型,但仍然能够为其分配任何派生类,例如:

class BaseClass
{
...
};

class DerivedClass : public BaseClass
{
...
};

BaseClass *randomObj = new DerivedClass;

答案 1 :(得分: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"));

答案 2 :(得分:0)

你说你是C ++的新手,你用来描述你想要的语法表明你更熟悉Java或C#等其他语言。您显示的语法在这些语言中正常工作:

Foo myFoo = new DerivedFoo;

这是有效的,因为在Java和C#myFoo的幕后实际上表现为指向Foo的指针,而不是作为能够存储Foo的固定存储区域的名称。在C ++中,语法Foo myFoo创建了这样一个固定的内存区域。即使你试图通过这样做来放置一些派生类型:

DerivedFoo myDerivedFoo;
Foo myFoo = myDerivedFoo;

myFoo仍然只能保存Foo对象。在myFoo的初始化期间,所有不是Foo的东西都会被“切掉”,因为它不适合那个固定的内存区域。

所以在C ++中你必须使用C ++的指针语法明确地做幕后的Java和C#:

    Foo *myFoo = new DerivedFoo;

现在myFoo是一个指向Foo的指针,该指针可以引用任何Foo对象,包括DerivedFoo的Foo部分,没有任何切片或任何发生的事情。 new DerivedFoo创建一个可以存在DerivedFoo的内存区域,然后将myFoo设置为指向所创建的Foo的{​​{1}}部分。