如何以及为什么可以更改成员的访问级别?

nak*_*iya 6 c++ oop

昨天我结束了编码(有一些帮助)这样的事情:

#include <iostream>

using namespace std;

class A
{
    public:
        virtual void foo(){cout << "A::foo\n";}
};

class B : private A
{
    private:
        virtual void foo(){ cout << "B::foo\n";}
        void DoSomething(SomeOtherClass& o){o.DoSomething(*static_cast<A*>(this));}
};
Run Code Online (Sandbox Code Playgroud)

我尝试更改继承方法:

class B : public A
{
    private:
        virtual void foo(){ cout << "B::foo\n";}
};

int main()
{
    A* a = new B;
    a->foo();
}
Run Code Online (Sandbox Code Playgroud)

这仍然有效.我期望编译时错误.请告诉我为什么这是可能的以及可能的用途是什么?由于第一种情况,我知道一种用法 - 您可以为不同的类公开不同的接口.

编辑:

在第二种情况下,输出是B::foo.

Chu*_*dad 1

可能无法直接回答您所有的问题,但我决定将其放在这里以供将来参考。另外,请对此持保留态度,因为这是基于我对 C++ 标准世界中发生的事件的理解,而不是实际情况。

这个。我没有随身携带 ARM,但文章提供了必要的详细信息。

C++0x 中的注释 115 说

115) 不推荐使用访问声明;成员 using-declarations (7.3.3) 提供了更好的方法来做同样的事情。在 C++ 语言的早期版本中,访问声明受到更多限制。为了简单起见,它们被概括并等同于 using 声明。鼓励程序员在新代码中使用 using 声明,而不是访问声明的新功能。

总之:

我认为 ARM 最初是禁止的:

访问声明不能用于限制对基类中可访问的成员的访问,也不能用于允许对基类中不可访问的成员的访问。

但后来我想当标准发展时这最终被允许