【问题标题】:inheritance and declaration of functions c ++函数c ++的继承和声明
【发布时间】:2021-11-10 12:31:03
【问题描述】:

我有 3 个课程:

  1. A 类
  2. B 类
  3. C 类

在class A中,声明了2个方法,一个是void,第二个是virtual void。 virtual void Method2 在 class B 中定义。 在class C,我打电话给Method1和Method2;

因此,我收到以下错误:

错误:在此上下文中无法访问“void Base::A::Method1()”

错误:'Base::A' 不是'Main::B' 的可访问基础

namespace Base {
   class A {
   public:
      A() {}
      void Method1() {std::cout << "it is method1\n";}
      virtual void Method2() =0;
   }; // class A
} // namespace Base

namespace Main {
   class B : A {
   public:
      B() {}
      void Method2() {}
   }; // class B

   class C {
   public:
      C() {}
      void Handle() {
         b->Method1(); // it is good
         b->Method2(); // this is error
      }
   private:
      std::unique_ptr<B> b;
   }; // class C

} // namespace Main

可能是什么问题?

【问题讨论】:

  • 错误清楚地表明问题出在Method1(),你认为是好的。它没有在这个minimal reproducible example 中实现,这就解释了为什么它没有编译。继承时,您也没有正确地确定类 A 的声明范围。这是一个合法的模式,命名空间将你的基地与孩子分开吗?我没有立即看到好处。不代表没有。
  • 方法 1 调用 std::cout。我将 A 类从 Base 移到 Main。问题依然存在。
  • 就像我所说的合格名称:godbolt.org/z/3xWE6qfx6 总是担心第一个错误。
  • 继承应该是公开的以执行动态调度和类型包含。 class B : public Base::A
  • 嗯,它是一种私有继承,它与类型包含无关,而是一种纯粹的继承,一种奇怪实现组合的方式。

标签: c++ inheritance declaration


【解决方案1】:

您在一条指令中犯了两个错误,即类 B 的声明。在

的背景下
namespace Base {
   class A {...}
}

此声明

namespace Main {
   class B : A {

将B 声明为继承自A 或当前命名空间层次结构中的某个类的类。编译器将尝试Main::A 并找不到它。然后它将尝试全局命名空间::A,也将无法在那里找到A。它肯定不会尝试当前命名空间层次结构之外的命名空间,尤其是,它肯定不会尝试Base::A。未能找到与A 匹配的类,它将因错误而停止。

第二个错误是你私下继承了基类。这意味着有关此继承的信息在类B 之外是不可见的,因此您无法调用B 之外的任何基类成员。

解决方案:

namespace Main {
   class B : public Base::A {

【讨论】:

    猜你喜欢
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多