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

Posted

技术标签:

【中文标题】C++:从父实例调用子方法【英文标题】:C++ : Calling a child method from parent instantiation 【发布时间】: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 的对象。 这只是我写这个简化代码示例时犯的一个错误 【参考方案1】:

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

void operation(A& a)

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

【讨论】:

既然你这么说,这似乎很明显。现在工作正常,非常感谢^^!

以上是关于C++:从父实例调用子方法的主要内容,如果未能解决你的问题,请参考以下文章

应该从父 ViewController 还是子 ViewController 调用 popViewController?

在 JavaScript 中从父级调用子方法

如果尚未调用子组件,如何从父组件调用子组件方法?

如何从父组件调用子组件方法

从父类调用子组件方法 - Angular

从父组件调用时,angular 2 变量在子组件方法中返回 null