如何在基类中创建子类对象

时间:2018-12-02 14:06:33

标签: c++ class inheritance subclass base-class

我想做的是:

  • Sub类中有一个Base类对象。
  • 使Sub类访问Base类的变量

Base.h

#include "Sub.h"
class Base
{

Sub subobject
int x;
}

Sub.h

#include Base // to acces x from .cpp file
class Sub: public Base
{
void changevar();
}

Sub.cpp

#include "Sub.h"
// I tried to include base in here but that did not work either
void Sub::changevar()
{
x++;
}

但是我一直在获取未定义的基类和未定义的未声明x错误。 我该怎么解决?

1 个答案:

答案 0 :(得分:1)

如果将子对象存储为指针怎么办?

您还需要

  • 在基类之前先在Base.h中声明子类
  • 将Sub.h包含在Base.cpp文件中
  • 调用new使其具有指向它的内容,并且显然要进行相应的删除(注意:不在构造函数中,因为这将创建一个循环,在该循环中,Base创建一个Sub,该Sub创建一个创建Sub的Base)

但是,一个基类引用一个子类似乎有点奇怪,它破坏了整个继承点,如果您需要这样做,那么您应该重新考虑您所做的操作是否正确。

还要注意,Sub将有其自己的Base作为其一部分,因此子对象的Base部分将与外部Base不同。

例如如果Base本身有一个称为Y的整数,那么我们将具有Base的Y,但子对象也具有单独的Y。

也许可以更好地解释为什么基类需要一个子类的副本?

粗略代码草图:

Base.h

#include "Base.h"

class Sub;

class Base
{
public:
    Sub* subobject;
    Base();
    ~Base();

    void createSub();
};

Base.cpp

#include "Base.h"
#include "Sub.h"

Base::Base()
{
    subobject = new Sub();
}

Base::~Base()
{
    delete subobject;
}

void Base::createSub()
{
    if (subobject)
        return;

    subobject = new Sub();
}

Sub.h

#include "Base.h"

class Sub : public Base
{
    void changevar();
    int x = 0;
};

Sub.cpp

void Sub::changevar()
{
    x++;
}