Pointers C++;指针向量中的多变形方法问题
首先,我很抱歉我的英语不好,我不是英国人=/ 我有一个指向基类a的指针向量,它由类B和C填充。 B和C是来自A的多态类,它们只有一个方法setTest()。 现在我想通过向量从B/C调用一个方法:Pointers C++;指针向量中的多变形方法问题,pointers,methods,vector,polymorphism,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*)向量; 向量推回(新类b()
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*)向量;
向量推回(新类b());
向量推回(新类c());
for(int i=0;isetTest(真);
但是编译器说我的基类A中没有setTest()方法。
有什么办法可以解决这个问题吗?因为编译器“思考”处理A,所以它不能推断出方法setTest
存在
要解决此问题,可以执行以下操作:
将抽象方法添加到:
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);
for(int i=0;isetTest(true);
简单强制转换允许调用预期的方法。但是!!!如果vector可以包含一个实例,那么它将失败,因此使用动态强制转换有助于:
for(int i=0;i<3;++i)
{
D *check_inst = dynamic_cast<D*>(vec[i]);
if( check_inst)
check_inst->setTest(true);
}
for(int i=0;isetTest(true);
}
是在类A中声明的虚拟void setTest(bool)吗?我们能看到更多的代码吗?(最好是失败的最小数量…)不,它必须是吗?这是一个例子的一部分,在这个例子中,方法被严格给定了类D的更多代码,失败发生的地方:#包括“B.h”#包括“C.h”#包括使用命名空间std;D::D(void){vector(A*)vec;vec.push_-back(new classB());vec.push_-back(new classC());for(int i=0;isetTest(true);}您还想要什么吗?应该是vector
,对吗?我假设没有添加方法(如果是抽象的或不是抽象的)就没有其他方法可以找到它了到基类?再次失败:无法创建抽象类的实例=(我不想继续讨论这个问题,但我认为我们需要看到所有的代码,它们的格式都很好,因为它们实际上是通过编译器进行的。例如,您尝试在何处添加这一行?它应该在类内部。。。