STL List,C ++中的多个对象类型

时间:2012-02-06 21:18:10

标签: c++ list object stl

所以我有这种类型的继承:

Class A { virtual intfB(){} ; virtual intfC(){}; };
Class B : public A { int fB(){}; };
Class C : public A { int fC(){}; };

然后我有一个E类,它使用一个列表来存储B和C对象。

Class E 
{
public:
    insert(A* obj){ l.push_front(obj);}
    print(){ /* uses iterator i to cout the fB() and fC() of the objects in l */ };

private:
    list <A*> l;
}

我在B中将Cvirtual对象的不同函数设置为A,然后使用迭代器i从{{1}中访问l个对象功能。我的问题是我无法找到一种正确的方法来调用print()B::fB(),因为迭代器可以指向C::fC()C对象,所以我必须做类似的事情对于每个我认为不实用的对象:

B

因此,无论类型如何,我都会为每个对象调用cout << (*i) -> fB(); cout << (*i) -> fC(); fC,并且当它不是被调用的正确对象时,将调用基类的虚函数。

这不可能是对的,不是吗?我怎么能实现这一目标?

另一方面,我应该使用E,C和B类的作文吗?

2 个答案:

答案 0 :(得分:0)

你是对的:不要这样做。如果要打印项目,请调用print中的函数A,并在两个子类中重写它。然后在迭代时对每个项目调用print,每个孩子做正确的事。

答案 1 :(得分:0)

如果intfB()和intfC()在技术上是相同的函数但具有不同的B和C实现,那么你应该在A中声明一个虚函数(也许称为intf),并在两者中提供必要的实现B和C.

抽象类的想法是定义该类的更详细实现将共享的基本功能。因此,使用上述方案,列表元素指向的每个对象都将保证具有intf()实现。

我不确定你的例子是否会编译(我没有测试过),因为B和C都没有为A中声明的虚函数提供实现。