首先,我是C ++的新手,尤其是以OOP方式使用C ++。我有一个有多个子类的类,我想知道我是否可以模糊地声明一个变量来接受一个对象而不限制哪些对象可以存储在其中。我问,因为多个孩子中的一个最终会被一次性使用。因此,如果我不能模糊地声明变量,我就可以确定哪些变量正在使用中。
的内容
obj randomObj = new className;
而不是
className randomObj = new className
答案 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}}部分。