【问题标题】:C++ Problem with polymorphed methods in vector of pointers指针向量中的多态方法的C++问题
【发布时间】:2011-04-06 14:40:55
【问题描述】:

首先很抱歉我的英语不好,我不是英语母语=/

我有一个指向我的基类 A 的指针向量,它由 B 类和 C 类填充。 B 和 C 是来自 A 的多态类,它们只有一个方法 setTest()。 现在我想通过向量从 B/C 调用一个方法:

vector (A*) vec;
vec.push_back(new classB());
vec.push_back(new classC());

for(int i=0;i<3;++i)
    vec[i]->setTest(true);

但是编译器说我的基类 A 中没有方法 setTest()。 有什么想法可以解决这个问题吗?

【问题讨论】:

  • 是虚拟的 void setTest(bool);在 A 类中声明?
  • 我们能看到更多的代码吗? (最好是失败的最小数量......)
  • 不,必须这样吗?这是严格给出方法的考试的一部分
  • 更多 D 类代码,失败发生的地方:#include "B.h" #include "C.h" #include using namespace std; D::D(void) { 向量 (A*) vec; vec.push_back(新类 B()); vec.push_back(new classC()); for(int i=0;isetTest(true); } 你还想要吗?
  • 应该是vector&lt;A*&gt;吧?

标签: pointers methods vector polymorphism


【解决方案1】:

由于编译器“认为”处理 A,它不能推断出方法 setTest 存在。

要解决此问题,您可以执行以下操作:

给A添加抽象方法:

 virtual void setTest(bool value) = 0;

更新

还有另一种方法。让我们只用一种方法创建辅助接口 D:

 struct D
 {
     virtual void setTest(bool value) = 0;
 };

比使用B和C的多重继承改变签名:

class B : public A, public D
{
     virtual void setTest(bool value)
     {
         //your impl goes here...
     }
};

//do the same with impl of C

最后让我们改变迭代:

for(int i=0;i<3;++i)
    ((D*)vec[i])->setTest(true);

简单的转换允许调用预期的方法。但!!!如果向量可以包含 A 的实例,那么它将失败,因此使用 dynamic_cast 会有所帮助:

for(int i=0;i<3;++i)
{
     D *check_inst = dynamic_cast<D*>(vec[i]);
     if( check_inst)
        check_inst->setTest(true);
}

【讨论】:

  • 我认为没有任何其他方法可以在不向基类添加方法(无论是否抽象)的情况下解决这个问题?
  • 再次失败:无法创建抽象类的实例 =(
  • 我不想继续讨论这个问题,但我认为我们需要看到所有的代码,它们的格式很好,因为它实际上是通过编译器的。例如,您尝试在哪里添加此行?它应该在课堂内......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 2018-10-02
  • 2019-06-17
  • 1970-01-01
相关资源
最近更新 更多