以下代码是否适用于C++标准?奇怪的是C :: B可以工作,因为结构B在A的名字空间中。但它使用gcc编译得很好。不直观的嵌套类继承
struct A { struct B {}; };
struct C : public A::B {};
struct D : public C::B {};
如果这是符合C++的标准,那么这个构造的合理应用是什么? 谢谢。
以下代码是否适用于C++标准?奇怪的是C :: B可以工作,因为结构B在A的名字空间中。但它使用gcc编译得很好。不直观的嵌套类继承
struct A { struct B {}; };
struct C : public A::B {};
struct D : public C::B {};
如果这是符合C++的标准,那么这个构造的合理应用是什么? 谢谢。
是的,它是有效的C++。一个类在其自己的范围内(因此B
和B::B
指的是相同的类B
),并且类的父类位于其自己的作用域中。因此,由于B
在C
的范围内,并且B
处于其自己的范围内,因此C::B
指的是B
即A::B
。
(旁注:不要混淆一个命名空间有范围)
C++ 03§9第2款说:
一个类名插入进入级别名称之后立即声明的范围。 类名也被插入到类本身的范围内;这被称为注入类名称。 为了进行访问检查,将注入类名称视为它是公共成员名称。
谢谢!我没有意识到你可以这样做:'struct E:public A :: A :: A :: A :: A :: A :: A :: A :: B :: B {};'' – Voltron
这是标准符合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(){}
在一个类范围内定义的类使用范围解析从另一个范围寻址。
Nitpick; 'A'没有定义一个名字空间。 '::'是范围解析运算符,它也用于名称空间,但不仅用于名称空间。 –