Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;,是否可以使用要求对象属于某个类的声明对象? 首先,我是C++新手,尤其是在OOP方式下使用C++。我有一个包含多个子类的类,我想知道我是否可以含糊不清地声明一个变量来接受一个对象,而不限制可以在其中存储哪些对象。我这样问是因为一次会使用多个孩子中的一个。所以,如果我不能含糊不清地声明一个变量,我就可以找到一种方法来确定使用了众多变量中的哪一个_C++_Oop_Object - Fatal编程技术网

C++;,是否可以使用要求对象属于某个类的声明对象? 首先,我是C++新手,尤其是在OOP方式下使用C++。我有一个包含多个子类的类,我想知道我是否可以含糊不清地声明一个变量来接受一个对象,而不限制可以在其中存储哪些对象。我这样问是因为一次会使用多个孩子中的一个。所以,如果我不能含糊不清地声明一个变量,我就可以找到一种方法来确定使用了众多变量中的哪一个

C++;,是否可以使用要求对象属于某个类的声明对象? 首先,我是C++新手,尤其是在OOP方式下使用C++。我有一个包含多个子类的类,我想知道我是否可以含糊不清地声明一个变量来接受一个对象,而不限制可以在其中存储哪些对象。我这样问是因为一次会使用多个孩子中的一个。所以,如果我不能含糊不清地声明一个变量,我就可以找到一种方法来确定使用了众多变量中的哪一个,c++,oop,object,C++,Oop,Object,类似于 obj randomObj=新类名 而不是 className randomObj=new className由于所有类都派生自一个公共基类,因此您可以将变量声明为该基类类型,但仍可以为其分配任何派生类,例如: class BaseClass { ... }; class DerivedClass : public BaseClass { ... }; BaseClass *randomObj = new DerivedClass; 容器只能由相同类型的对象组成。如果需要异构集合,

类似于

obj randomObj=新类名

而不是


className randomObj=new className

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

class BaseClass
{
...
};

class DerivedClass : public BaseClass
{
...
};

BaseClass *randomObj = new DerivedClass;

容器只能由相同类型的对象组成。如果需要异构集合,则需要将“句柄”类型粘贴到容器中,并间接访问对象。标准句柄类型是指针,标准结构是
std::vector
,如下所示:

#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;
#包括
#包括
#包括
模板
std::unique_ptr使_唯一(Args&&…Args)
{
返回std::unique_ptr(新的T(std::forward(args)…);//或“::new”
}
结构基
{
虚拟~Base(){}
};
结构Derived1:Base{/*…*/};
struct-Derived2:Base{/*…*/};
struct Derived3:Base{/*…*/};
std::向量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"));
v.push_back(使_唯一(true,'a'));
v、 向后推_(使_唯一(11,22,33));
v、 推回(使你独一无二(“你好”,“世界”));

<>代码>你说你是C++新手,你用来描述你想要的语法暗示你更熟悉其他语言,如java或C语言。您显示的语法在这些语言中运行良好:

Foo myFoo = new DerivedFoo;
这是因为,在Java和C#
myFoo
的幕后,它实际上是指向Foo的指针,而不是能够存储Foo的固定内存区域的名称。在C++中,语法<代码> FO Myfo < /Cord>创建了这样一个固定内存区域。即使您试图通过这样做来放置某些派生类型:

DerivedFoo myDerivedFoo;
Foo myFoo = myDerivedFoo;
myFoo
仍然只能保存Foo对象。在初始化
myFoo
的过程中,非Foo的所有内容都会被“切掉”,因为它不适合固定内存区域

<> P>在C++中,你必须明确地使用C+的指针语法:在后台做java和C++做的事情:

    Foo *myFoo = new DerivedFoo;

现在
myFoo
是一个指向Foo的指针,该指针可以引用任何
Foo
对象,包括派生Foo的Foo部分,而无需进行任何切片或任何操作
new DerivedFoo
创建一个内存区域,其中可以存在DerivedFoo,然后将
myFoo
设置为指向所创建的
DerivedFoo
Foo
部分;您可以使用指向基类型的指针。查找继承和多态性。