不直观的嵌套类继承

时间:2012-09-27 19:29:22

标签: c++ inheritance gcc

以下代码是否适用于C ++标准?奇怪的是C :: B可以工作,因为struct B在A的命名空间中。但它确实可以用gcc编译。

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

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

2 个答案:

答案 0 :(得分:3)

是的,它是有效的C ++。一个类在其自己的范围内(因此BB::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(){}

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