c++ - 为什么可以更改虚拟成员或公共(public)基类的可见性?

标签 c++ oop

在代码库中浏览我发现了以下内容:

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/

相关文章:

c++ - C++中的头文件

c++ - unix 应用程序在发送 SIGINT 时在 fread() 期间挂起

php - 避免在 mysql 查询中进行硬编码

c++ - 用户定义的类和标准类之间有区别吗?

c++ - 覆盖删除运算符

c++ - 使用boost的字节序转换

c++ - while (cin >> *pchar) 在 Ctrl-Z 之后等待进一步输入

c++ - 如何将可变数量的参数转发给另一个函数?

javascript - 在特定实例上实现方法?

javascript - 为什么需要设置原型(prototype)构造函数?