C++:从父类实例调用子类方法

6
在我的代码中,我已经实现了以下这些类:
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为参数并调用fun()方法,同时将一个B对象作为参数传递。
执行时,我期望字符串"1"被打印出来,但实际上打印的是"0"(即使是传递给operation()的B对象)。
我需要这样做是因为我有几个B类(B1、B2等),我希望函数operation()是通用的。我不需要在类A中实现operation(),但如果我声明operation()为纯虚拟的,则编译会在operation()处失败,说我不能实例化A(这是可以预料的)。
我找到了很多关于父/子方法调用和继承的话题,但没有一个确切地讨论这个问题。
有人能帮帮我吗?
谢谢。

注意:对于对象的默认构造,您不应使用括号。B b() 不会调用 B 的默认构造函数,而是声明了一个名为 b 的函数,该函数不带参数并返回类 B 的对象。 - Johannes S.
这只是我在编写这个简化的代码示例时犯的错误。 - Senua
1个回答

10

您需要通过引用传递对象或传递指针。

void operation(A& a)

因为你是按值传递,所以派生对象被切割了 - 一个类型为A的新对象在函数作用域内被创建。


现在你说了,这似乎很明显。现在可以正常工作了,非常感谢 ^^! - Senua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接