不直观的嵌套类继承

Unintuitive nested class inheritance

本文关键字:继承 嵌套 直观      更新时间:2023-10-16

以下代码在标准C++有效吗?奇怪的是,C::B 会起作用,因为结构 B 在 A 的命名空间中。但它确实可以用 gcc 编译得很好。

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

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

是的,它C++有效。 类在其自己的作用域中(因此BB::B都引用同一个类B),而类的父类在其自己的作用域中。 因此,由于BC的范围内,而B在它自己的范围内,C::B指的是A::B B

(旁注:不要将命名空间作用域混淆。

C++03 §9 第 2 段说:

类名

入到在看到类名后立即声明它的作用域中。也入到类本身的作用域中;这称为注入类名。 出于访问检查的目的,注入的类名被视为公共成员名。

这是

符合标准的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(){}

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