【发布时间】:2021-11-10 12:31:03
【问题描述】:
我有 3 个课程:
- A 类
- B 类
- 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