您正在寻找的是运行时多态性,这意味着让对象采用“多种形式”(即a或b),并随着程序运行相应地采取行动。在C++中,这样做通过使功能virtual
在基类a
:
virtual void print() {cout << "hello"};
然后,需要存储由指针或引用的元素,以及 - 如在一般的派生类可以引入新的数据成员并且需要更多的存储 - 这是正常的与new
在堆上创建的对象:
a* blah[10];
blah[5] = new b();
然后,您可以拨打:
blah[5]->print();
它会调用print()
的b
实现。
您应该稍后delete blah[5]
(以及您指向的任何其他内存由new
返回)。
在实践中,最好使用一个容器,当容器本身被破坏时,可以删除它所包含的对象,无论是由于留下作用域还是被删除。 std::vector<>
就是这样一个容器。您还可以使用智能指针来自动删除a
和b
对象。如果在执行delete
语句之前抛出异常,并且希望程序保持运行而不泄漏内存,这有助于使代码正确。 boost库是从中获得智能指针实现的最简单/最好的地方。总之:
#include <vector>
#include <boost/shared_ptr.hpp>
std::vector<boost::shared_pointer<a> > blah(10);
blah[5] = new b();
(这是比较正常的使用向量与push_back()
,因为它通过调用vector::size()
自动增长,以适应在所有已添加的元素,新的总可用的矢量。)