昨天我结束了编码(有一些帮助)这样的事情:
#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.
可能无法直接回答您所有的问题,但我决定将其放在这里以供将来参考。另外,请对此持保留态度,因为这是基于我对 C++ 标准世界中发生的事件的理解,而不是实际情况。
读这个。我没有随身携带 ARM,但文章提供了必要的详细信息。
C++0x 中的注释 115 说
115) 不推荐使用访问声明;成员 using-declarations (7.3.3) 提供了更好的方法来做同样的事情。在 C++ 语言的早期版本中,访问声明受到更多限制。为了简单起见,它们被概括并等同于 using 声明。鼓励程序员在新代码中使用 using 声明,而不是访问声明的新功能。
总之:
我认为 ARM 最初是禁止的:
访问声明不能用于限制对基类中可访问的成员的访问,也不能用于允许对基类中不可访问的成员的访问。
但后来我想当标准发展时这最终被允许
| 归档时间: |
|
| 查看次数: |
1135 次 |
| 最近记录: |