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