【问题标题】:Calling base method however only second level base method exists调用基本方法但是只存在二级基本方法
【发布时间】:2020-06-24 11:09:41
【问题描述】:

想象一个包含许多继承的庞大代码库。在某些时候,您必须使用的课程中出现了一条线。

inherited::Load();

这就是按照它说的去做。它将基础对象加载到内存中。 inherited 是基类的 typedef。
但是实际的父类没有 Load 方法

举个简单的例子:

class Base {
public:
  Base() {};
  void Load() {
    cout << "Base ok" << endl;
  }
};

class Derived : public Base {
public:
  Derived() {};
};

class MostDerived : public Derived {
public:
  MostDerived(){};
  void Load() {
    Derived::Load();
    cout << "Child ok"<< endl;
  }
};

这里,如果我们调用MostDerived.Load(),它会调用其父类的Load方法,但Derived类没有自己的Load,只有Base的Load方法。

这里到底发生了什么?为什么没有编译问题? Derived 类是否复制了基类的所有方法,所以它会有一个 Load 方法什么是打印“Base ok”?还是 Derived 只是简单地调用了 Base 方法?

我发现了一个相关的问题Do ALL virtual functions need to be implemented in derived classes?,答案是这样的

它从其祖先类继承 bar 实现。

对我来说,它仍然怀念显式调用 Derived::Load() 方法有效。但是,只有一个 Base::Load() 方法存在。

【问题讨论】:

  • Derived 确实有一个Load 方法,该方法继承自Base
  • 请记住,继承是一种“是”的关系。 MostDerived是一个Derived,而Derived是一个Base,这也意味着MostDerived是一个基`.
  • @Someprogrammerdude 是的,init 应该是 Load。感谢您指出 - 已编辑

标签: c++ oop inheritance


【解决方案1】:

这里到底发生了什么?为什么没有编译问题? Derived 类是否复制了基类的所有方法,所以它会有一个 Load 方法,打印“Base ok”是什么?

是的。派生类从基类继承所有方法。 (是的,所有这些,是否可以访问它们取决于为方法指定的访问权限)。

对我来说,它仍然错过了显式调用 Derived::Load() 方法有效的方法。但是,只有一个 Base::Load() 方法存在。

草率地说Derived:: 只会告诉编译器查找可从Derived 访问的名称。由于Derived 确实继承自Base,它确实有一个Load 方法。

注意到Derived::Load 确实指的是Base::Load,也许你的困惑可以稍微消除一下:

#include <type_traits>
#include <iostream>
struct Base {
    void Load() {}
};
struct Derived : Base {};

int main() {
    std::cout << std::is_same_v< decltype(&Derived::Load), void (Derived::*) ()>;
    std::cout << std::is_same_v< decltype(&Derived::Load), void (Base::*) ()>;
}

这打印出01,因为Derived::Load确实是Base的一个方法。

我希望这个例子不会增加混乱;)。它使用std::is_same 来查看两种类型是否相同。 &amp;Derived::Load 给了我一个成员函数指针,指向Derived 中的Load 方法,我通过decltype 推断其类型。我将它与指向Derived 方法的指针进行比较,然后将其与指向Base 方法的指针进行比较。原来Derived::LoadBase的方法。

【讨论】:

  • 感谢您的澄清。现在干净多了。所以 Derived:: 只告诉它必须在任何地方搜索 Load 方法,派生可访问的地方。就像派生定义和基本定义一样。它找到了Base的方法。
  • 如果我做对了,第一条语句是假的 -> 打印 0,因为 Derived::Load decltype 是 Base,不等于 Derived。第二个语句为真,所以它打印 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 2010-09-06
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
相关资源
最近更新 更多