【问题标题】:C++ : Calling a child method from parent instantiationC++:从父实例调用子方法
【发布时间】:2014-02-07 10:58:12
【问题描述】:

在我的代码中,我实现了这些类:

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 的默认c'tor,而是声明一个函数b,它不接受任何参数并返回一个类B 的对象。
  • 这只是我写这个简化代码示例时犯的一个错误

标签: c++ inheritance


【解决方案1】:

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

void operation(A& a)

因为您是按值传递的,所以派生对象被切片 - 在函数范围内创建了一个 A 类型的新对象。

【讨论】:

  • 既然你这么说,这似乎很明显。现在工作正常,非常感谢^^!
猜你喜欢
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
相关资源
最近更新 更多