首先,对不起我的英语不好,我不是英国人= /
我有一个指向我的基类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()。 我有什么想法可以解决这个问题吗?
答案 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);
}