以下代码是否适用于C ++标准?奇怪的是C :: B可以工作,因为struct B在A的命名空间中。但它确实可以用gcc编译。
struct A { struct B {}; };
struct C : public A::B {};
struct D : public C::B {};
如果这是符合标准的C ++,那么这个构造的合理应用是什么? 感谢。
答案 0 :(得分:3)
是的,它是有效的C ++。一个类在其自己的范围内(因此B
和B::B
都引用相同的类B
),并且类的父类在其自己的范围内。因为B
位于C
的范围内且B
位于其自己的范围内,C::B
指的是B
A::B
。< / p>
(附注:不要将名称空间与范围混淆。)
C ++03§9第2段说:
class-name 被插入到在看到 class-name 之后立即声明它的范围内。 class-name 也会插入到类本身的范围内;这被称为 inject-class-name 。 出于访问检查的目的, inject-class-name 被视为公共成员名称。
答案 1 :(得分: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(){}
在一个类范围内定义的类是使用范围解析从另一个范围寻址的。