在我的代码中,我实现了这些类:
class A
{
public:
virtual int fun() { return 0; }
}
class B : public A
{
public:
virtual int fun() { return 1; }
}
这些功能:
void operation(A a)
{
printf("%d\n",a.fun());
}
int main()
{
B b;
operation(b);
return 0;
}
如您所见,B类继承了A,并实现了虚拟继承方法fun()
。主类调用一个函数,该函数接受A in参数并调用fun()
方法,并在参数中使用B对象。
在执行时,我希望打印字符串"1"
,但它是"0"
(即使它是传递给operation()
的B对象)。
我需要这样做,因为我有几个B类(B1,B2等等),我希望函数operation()
是通用的。
我不需要在类A中实现operation()
,但如果我声明operation()
纯虚拟,则编译在operation()
失败,说我不能实例化A(它是相当的预期)。
我发现很多话题都在谈论父/子方法调用和继承,但没有一个准确地讨论过这个问题。
有人可以帮助我吗?
感谢。
答案 0 :(得分:10)
您需要通过引用传递对象或传递指针
void operation(A& a)
因为您正在按值传递,所以派生对象会被切片 - 在函数范围内创建类型为A
的新对象。