不直观的嵌套类继承
Unintuitive nested class inheritance
以下代码在标准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
指的是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(){}
在一个类的作用域内定义的类使用作用域解析从另一个作用域寻址。
相关文章:
- C++从外部类继承的嵌套类;不允许使用不完整的类型
- 嵌套类、继承和C++中的共享指针
- 如何重写继承的嵌套类中存在的虚拟方法
- 返回自身内部的双重嵌套类的成员函数,该类继承自从自身继承的类
- 嵌套结构属性继承
- C++嵌套类从嵌套类继承,请键入 issue
- 如何解释嵌套继承类结构?
- 继承和嵌套名称的陷阱
- 嵌套类继承的错误
- 嵌套类和继承
- 为什么 Visual C++无法编译从私有嵌套类继承的友元模板
- 继承类中嵌套类的可见性
- 为什么 GCC 允许从私有嵌套类继承
- 为什么 GCC 不允许在你是朋友时从私有嵌套类继承
- 在 C++11 中,从私有嵌套类型继承是否合法?
- C++ 嵌套前向声明继承
- 不直观的嵌套类继承
- 我应该在 c++ 中的派生类中继承嵌套类吗?
- 继承嵌套模板类的实现
- 继承嵌套类时出现C4091错误