从公共接口继承时,为什么实现是公共的还是私有的并不重要?

Mir*_*cek 1 c++ virtual inheritance

我可能很好,只是厌倦了或者远离C++但是这个人今天真的很惊讶我:

#include <iostream>

class Interface
{
public:
    virtual int aa() const = 0;
    virtual int bb() const = 0;
};

class Usage : public Interface
{
private:
    virtual int aa() const
    {
        int a = 10 * 10;
        return a;
    }

    virtual int bb() const
    {
        int b = 20 * 20;
        return b;
    }
};

int main(int argc, char* argv[])
{
    Interface* i = new Usage();
    std::cout << i->bb() << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望编译器和/或链接器会抱怨错误的函数签名或至少缺少实现.考虑到这是有效的,当它被顶级声明隐藏时,public/protected/private修饰符的含义是什么?

这个规则如何在C++中调用?

Bjö*_*lex 7

这在标准第11.6.1段中有详细说明:

虚函数的访问规则(第11节)由其声明确定,并且不受稍后覆盖它的函数规则的影响.[ 示例 - 与您的基本相同 ]使用表达式的类型在调用点检查访问,该表达式用于表示调用成员函数的对象.成员函数在定义它的类中的访问通常是未知的.