内类基类的特例

时间:2011-06-09 18:44:29

标签: c++ inheritance inner-classes

在c ++中,是否可能声明内部类(CInner),使其具有外部类(COuter)作为其基类?

这个问题是关于c ++技术问题的。不是编程风格或个人喜好的问题。

3 个答案:

答案 0 :(得分:9)

是。这编译:

class COuter
{
    class CInner;
};

class COuter::CInner : public COuter
{
};

这是必需的原因是派生类要求整个定义出现在自己的定义中。所以你只需要确保在内部类的定义开始之前完全定义外部类。

答案 1 :(得分:2)

可以声明从封闭类派生的内部/嵌套类。但是你不能同时定义你的嵌套类。例如,如果您尝试编译此代码,它将无效使用不完整类型的COuter。

class COuter
{

    class CInnner : COuter
    {

    }
}

但是如果你只是声明你的类和延迟内部类的定义,那么它将起作用,因为那时Couter类的定义将是完整的。换句话说,除非完全定义,否则不能使用类型。

正如John Calsbeek所说,以下代码行将起作用。

class COuter
{
    class CInner;
};

class COuter::CInner : public COuter
{
};

此处还讨论了此主题以供参考。 Can a nested C++ class inherit its enclosing class?

答案 2 :(得分:1)

以下代码编译并运行良好:

#include <iostream>

using namespace std;

class COuter
{
  public:
  COuter ()
  {
    cout << "COuter() called" << endl;
  }

  class CInner;
};

class COuter::CInner : public COuter
{
  public:
    CInner()
    {
      cout << "COuter::CInner() called" << endl;
    }
};

int main()
{
  COuter o;
  COuter::CInner i;

  return 0;
}

输出:

$ ./inner-outer.exe 
COuter() called
COuter() called
COuter::CInner() called