2012-09-27 71 views
2

以下代码是否适用于C++标准?奇怪的是C :: B可以工作,因为结构B在A的名字空间中。但它使用gcc编译得很好。不直观的嵌套类继承

struct A { struct B {}; }; 
struct C : public A::B {}; 
struct D : public C::B {}; 

如果这是符合C++的标准,那么这个构造的合理应用是什么? 谢谢。

+1

Nitpick; 'A'没有定义一个名字空间。 '::'是范围解析运算符,它也用于名称空间,但不仅用于名称空间。 –

回答

3

是的,它是有效的C++。一个类在其自己的范围内(因此BB::B指的是相同的类B),并且类的父类位于其自己的作用域中。因此,由于BC的范围内,并且B处于其自己的范围内,因此C::B指的是BA::B

(旁注:不要混淆一个命名空间范围

C++ 03§9第2款说:

一个类名插入进入级别名称之后立即声明的范围。 类名也被插入到类本身的范围内;这被称为注入类名称。 为了进行访问检查,将注入类名称视为它是公共成员名称。

+0

谢谢!我没有意识到你可以这样做:'struct E:public A :: A :: A :: A :: A :: A :: A :: A :: B :: B {};'' – Voltron

0

这是标准符合C++。

嵌套类的合理应用(通过作用域解析)是pImpl设计模式(尽管您可以通过不会展示嵌套类的方式实现它,但在此我选择演示嵌套类)。 注意:继承是可以混淆的一个方面,但真正的概念是嵌套类的范围解析。

//ExposedClass in Exposed.h 

class CExposedClass 
{ 
public: 
CExposedClass(); 
~CExposedClass(); 
void doThis(); 
void doThat(); 

private: 
class CXImpl; 
CXImpl *pImpl; 

}; 

//ExposedClass Impl in Exposed.cpp 

#include "Exposed.h" 

class CExposedClass::CXImpl 
{ 
int someData; 
}; 

CExposedClass::CExposedClass():pImpl(new CXImpl()){} 
CExposedClass::~CExposedClass(){delete pImpl;} 
void CExposedClass::doThis(){} 
void CExposedClass::doThat(){} 

在一个类范围内定义的类使用范围解析从另一个范围寻址。