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

时间:2012-10-24 11:27:28

标签: c++ arrays inheritance pointers derived-class

如果我有一个基类,只有虚拟方法和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();

(或类似的东西)

...以便我可以通过BaseClass访问DerivedClass方法, 但是通过指针,指针是一个DerivedClass s?

的数组

5 个答案:

答案 0 :(得分:9)

您的数组类型错误:它将BaseClass个对象实例而非指针存储到它们中。由于BaseClass似乎是抽象的,编译器会抱怨它不能默认构造实例来填充数组。

即使BaseClass不是抽象的,多态使用数组也是C ++中的big no-no所以你无论如何都要做不同的事情。

通过将代码更改为:

来解决此问题
BaseClass** base = new BaseClass*[2];

BaseClass[0] = new FirstDerivedClass;
BaseClass[1] = new SecondDerivedClass;

尽管如此,大部分时间最好使用std::vector而不是普通数组和智能指针(例如std::shared_ptr)而不是哑指针。使用这些工具而不是手动编写代码将以极小的运行时成本透明地处理大量问题。

答案 1 :(得分:3)

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()) );

答案 2 :(得分:2)

如果您的BaseClass包含纯虚方法,则无法编译:

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() );

答案 3 :(得分:0)

这是答案(来自Rubby)

BaseClass* Base[2];

Base[0] = new FirstDerivedClass;
Base[1] = new SecondDerivedClass;

答案 4 :(得分:0)

定义指针数组,指针类型为BaseClass。 并将指向derivedclass的指针分配给数组的元素。 就像:

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