【问题标题】:Multiple object types in STL List, C++STL List,C ++中的多种对象类型
【发布时间】: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 中将BC 对象的不同函数设置为virtual,然后使用迭代器i 从print() 函数中访问l 个对象。我的问题是我找不到调用B::fB()C::fC() 的正确方法,因为迭代器可以指向CB 对象,所以我必须为每个我不这样做的对象做这样的事情' t认为那实用:

cout << (*i) -> fB();
cout << (*i) -> fC();

所以基本上我为每个对象调用fCfB,而不管类型如何,并且当基类的虚函数不是正确调用的对象时,它会被调用。

这不可能是对的,是吗?我还能如何做到这一点?

顺便说一句,我应该为 E、C 和 B 类使用作文吗?

【问题讨论】:

  • 如果您想在B 上调用一个函数,在C 上调用另一个函数,那么您在设计阶段就做错了。
  • 您似乎了解虚函数的概念,所以我不会建议 virtual int f(),因为 B 和 C 会有所不同,但您可能正在寻找 ((B*)(*i))-&gt;fB(),不是你呢?
  • 我对您要做什么感到有些困惑。假设 i 是 std::list::iterator 类型,那么您应该能够在列表中的每个对象上调用 i->fB() 和 i->fC() 并获得正确的实现(如果它是 B对象,您将获得 B::fB 和 A::fC,如果它是 C 对象,您将获得 A::fB 和 C::fC)。如果这不是您想要的,那么您不应该将它们全部放在同一个列表中,并且可能它们不应该都来自同一个基础。
  • 是的,如果它是 B 对象,我想避免调用 A::fC,因为它不是必需的,但如果我必须将对象放在同一个 std:list 中,我找不到任何解决方法。

标签: c++ list object stl


【解决方案1】:

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

【讨论】:

  • 我认为这正是我想要的,但不知何故我想不出那个。谢谢你帮我解围^^
【解决方案2】:

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

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

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

【讨论】:

  • fB 和 fC 实际上有不同的实现,它们分别对 B 类和 C 类是唯一的,我只需在 A 类中将它们都声明为虚拟的,这样我就可以在列表中使用迭代器。
猜你喜欢
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
相关资源
最近更新 更多