超类中的C ++引用子类

时间:2012-11-07 17:39:59

标签: c++ oop inheritance

我对在C ++中引用超类内部的子类感到困惑。 例如,给定Java:

public class Entity {


  protected ComplexEntity _ce;

  public Entity() {

  }

  public ComplexEntity getCentity() {
    return _ce;
  }
}

ComplexEntity扩展实体。它工作。在子类中,我调用getCentity()没有错误。

现在,在C ++中,当我写这样的东西时:

 #pragma once

 #include "maininclude.h"
 #include "ExtendedEntity.h"
 using namespace std;

 class EntityBase
 {
 public:
    EntityBase(void);
    EntityBase(const string &name);

    ~EntityBase(void);

 protected:

    ExtendedEntity* _extc;
    string   _name;
 };

我收到编译错误:

  error C2504: 'Entity' : base class undefined  

在继承自此Entity的类中。为什么会发生这种情况?

在C ++中完全不可接受吗?

可能是实体必须是抽象的吗? 我想就可能的解决方法提出建议。

3 个答案:

答案 0 :(得分:3)

您可以考虑使用CRTP,来自维基百科的剪切/粘贴:

// The Curiously Recurring Template Pattern (CRTP)
template<class Derived>
class Base
{
    Derived* getDerived() { return static_cast<Derived*>(this); }
};

class Derived : public Base<Derived>
{
    // ...
};

答案 1 :(得分:1)

C ++中的类需要知道其所有成员及其所有超类的大小。除非在类Entity之前定义了类ComplexEntity,否则类ComplexEntity不知道它的子类Entity的大小。但是,类ComplexEntity不知道其超类Entity的大小。

C ++中存在此问题,因为使用简单偏移计算访问类成员。您可以通过前向声明派生类并使用指针作为成员来解决此问题:

class Extended; // declare the derived class

class Base {  // define the base class
  Extended* e; // you cannot use Extended e here,
               // because the class is not defined yet.
};

class Extended : public Base {}; // define the derived class

答案 2 :(得分:1)

您的代码如下:

struct D : B {}; // error: B doesn't mean anything at this point

struct B {
    D *d;
};

你的标题ExtendedEntity.h试图在定义实体之前使用实体的定义。

您需要将代码更改为:

struct D;

struct B {
    D *d;
};

struct D : B {};