【发布时间】:2012-07-14 08:46:13
【问题描述】:
我按以下方式组织了三个班级。 Foo 是一个模板类,Bar 派生自 Foo,Doo 也派生自 Foo。它们都实现了doX() 成员函数,该函数在Foo 中定义为虚函数。
我需要一个包含Bar 和Doo 对象的向量(或任何其他容器)。例如,一个包含两个名为vec 的对象的向量,第一个元素应该是Doo,第二个元素应该是Bar。当我调用 vec[0].doX() Doo::doX() 时,应该调用。定义指向Foo 对象的指针向量,完成这项工作。但我不确定实例实际存储在哪里。如果我将指针指向对象,则分配的内存可能会在离开创建对象的范围后被释放。
我准备了一个最小的工作示例来说明问题:
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
class Foo
{
public:
virtual void doX(){cout<<"doX from Foo"<<endl;}
};
template <typename T>
class Bar : public Foo<T>
{
public:
void doX(){cout<<"doX from Bar"<<endl;}
void g(string const &input); // some test function may be used in doX
int x; // some test data may be used in doX
};
template <typename T>
class Doo : public Foo<T>
{
public:
void doX(){cout<<"doX from Doo"<<endl;}
};
void doSomething(vector<Foo<int>* >& target)
{
Foo<int> X;
// do some extreme job to generate X
target.push_back(&X); // ==> This is problematic
}
int main()
{
Foo<int> f;
Bar<int> b;
Doo<int> d;
vector<Foo<int> > v;
v.push_back(f);
v.push_back(b);
v.push_back(d);
v[0].doX(); // doX from Foo
v[1].doX(); // doX from Foo
v[2].doX(); // doX from Foo
vector<Foo<int>*> v2;
v2.push_back(&f); // here is no problem, but if `f` is generated inside
// a function that receives a reference to `vec` there
// will be problems
doSomething(v2); // This is problematic
v2.push_back(&b);
v2.push_back(&d);
v2[0]->doX(); // doX from Foo
v2[1]->doX(); // doX from Foo but dangerous! May crash
v2[2]->doX(); // doX from Bar
v2[3]->doX(); // doX from Doo
return 0;
}
【问题讨论】:
标签: c++ oop templates inheritance