首先,我是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