C ++指针向量中的多态方法问题

时间:2011-04-06 14:40:56

标签: pointers methods vector polymorphism

首先,对不起我的英语不好,我不是英国人= /

我有一个指向我的基类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()。 我有什么想法可以解决这个问题吗?

1 个答案:

答案 0 :(得分: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);

简单转换允许​​调用预期方法。但!!!如果vector可以包含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);
}