指向基类数组的指针,填充派生类

Pointer to array of base class, populate with derived class

本文关键字:填充 派生 指针 基类 数组      更新时间:2023-10-16

如果我有一个基类,只有虚拟方法和2个派生的类基类,并实现了这些虚拟方法。

我如何:

 // causes C2259
 BaseClass* base = new BaseClass[2];
 BaseClass[0] = new FirstDerivedClass;
 BaseClass[1] = new SecondDerivedClass;

或:

// causes "base is being used without being initialized"
BaseClass* base;
// causes CC59 again
BaseClass* base = new BaseClass;
base[0] = FirstDerivedClass();
base[1] = SecondDerivedClass();

(或类似的东西)

...以便我可以通过DerivedClass访问BaseClass S方法但是指针和指针是DerivedClass S?

的数组

您的数组是错误的类型:它存储BaseClass对象 Instances 而不是 pointers 向它们存储。由于BaseClass似乎是抽象的,因此编译器抱怨它不能默认构造实例填充您的数组。

即使BaseClass不是抽象的,使用阵列在C 中使用阵列是一个很大的禁忌,因此无论如何,您都应该做不同的事情。

通过将代码更改为:

来解决此问题
BaseClass** base = new BaseClass*[2];
base[0] = new FirstDerivedClass;
base[1] = new SecondDerivedClass;

也就是说,在大多数情况下,最好使用std::vector代替普通阵列和智能指针(例如std::shared_ptr)而不是愚蠢的指针。使用这些工具而不是手动编写代码将以极小的运行时间成本透明地处理许多问题。

它是C 使用std::vector而不是简单的数组:

std::vector<BaseClass*> base;
base.push_back(new FirstDerivedClass());
base.push_back(new SecondDerivedClass());

正如Kerrek SB注意的最安全方法是使用std::unique_ptr

std::vector<std::unique_ptr<BaseClass> > base;
base.push_back( std_unique_ptr<BaseClass>(new FirstDerivedClass()) );
base.push_back( std_unique_ptr<BaseClass>(new SecondDerivedClass()) );

如果您的基本拉有纯虚拟方法,这将无法编译:

BaseClass* base = new BaseClass[2];

如果没有,您将获得内存泄漏。

在C 中,这是通过使用STD :: Vector或STD :: Array和某种智能指针来完成的。例如:

std::vector< std::shared_ptr< BaseClass > > arr( 2 );
arr[0].reset( new FirstDerivedClass() );
arr[1].reset( new SecondDerivedClass() );

这是答案(来自rubby)

BaseClass* Base[2];
Base[0] = new FirstDerivedClass;
Base[1] = new SecondDerivedClass;

定义指针阵列,指针类型是基础。并将指针分配给派生频道为数组的元素。就像:

BaseClass* base [2];
base[0] = new FirstDerivedClass;
base[1] = new SecondDerivedClass;