【发布时间】:2012-02-06 21:18:10
【问题描述】:
所以我有这种类型的继承:
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;
}
我在A 中将B 和C 对象的不同函数设置为virtual,然后使用迭代器i 从print() 函数中访问l 个对象。我的问题是我找不到调用B::fB() 和C::fC() 的正确方法,因为迭代器可以指向C 或B 对象,所以我必须为每个我不这样做的对象做这样的事情' t认为那实用:
cout << (*i) -> fB();
cout << (*i) -> fC();
所以基本上我为每个对象调用fC 和fB,而不管类型如何,并且当基类的虚函数不是正确调用的对象时,它会被调用。
这不可能是对的,是吗?我还能如何做到这一点?
顺便说一句,我应该为 E、C 和 B 类使用作文吗?
【问题讨论】:
-
如果您想在
B上调用一个函数,在C上调用另一个函数,那么您在设计阶段就做错了。 -
您似乎了解虚函数的概念,所以我不会建议
virtual int f(),因为 B 和 C 会有所不同,但您可能正在寻找((B*)(*i))->fB(),不是你呢? -
我对您要做什么感到有些困惑。假设 i 是 std::list::iterator 类型,那么您应该能够在列表中的每个对象上调用 i->fB() 和 i->fC() 并获得正确的实现(如果它是 B对象,您将获得 B::fB 和 A::fC,如果它是 C 对象,您将获得 A::fB 和 C::fC)。如果这不是您想要的,那么您不应该将它们全部放在同一个列表中,并且可能它们不应该都来自同一个基础。
-
是的,如果它是 B 对象,我想避免调用 A::fC,因为它不是必需的,但如果我必须将对象放在同一个 std:list 中,我找不到任何解决方法。