在代码库中浏览我发现了以下内容:
class Interface{
public:
virtual void func() = 0;
};
class Implementation : public Interface{
protected:
void func() override {};
};
我以为那会是一个编译错误,但似乎不是。这有什么意义?
最佳答案
在 C++ 中:
- 可访问性 是一个“静态”概念(在编译时检查),而
- virtual dispatch 是一个“动态”概念(要调用的实现是在运行时选择的)。
我们可以说 C++ 使这两个概念保持“正交”。
因此对于您的示例,这将编译(不是实际代码,只是说明):
Implementation obj;
Interface& ref = obj;
ref.func(); // (will call obj.func())
但这不会:
Implementation obj;
obj.func(); // error: Implementation::func is protected
有效地“强制”你只使用界面(这可能是故意的)。 — 编辑: 参见 Dieter Lücking's answer以获得更好的设计。
关于c++ - 为什么可以更改虚拟成员或公共(public)基类的可见性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20469918/