Что если вместо этого вы сохраните подобъект в качестве указателя?
Вам также потребуется
- Переслать объявление вашего подкласса в Base.h перед вашим базовым классом
- Включите Sub.h в ваш файл Base.cpp.
- Вызовите new, чтобы у него было что-то, указывающее на него, и, очевидно, соответствующее удаление (примечание: не в конструкторе, поскольку это создаст цикл, в которомBase создает Sub, который создает Base, который создает Sub)
Однако, кажется немного странным, что у базы есть ссылка на подкласс, она ломает всю точку наследования и, если вам нужносделайте это, тогда вам следует пересмотреть, если то, что вы делаете, является правильным.
Также обратите внимание, что Sub будет иметь свою собственную Base как часть его, поэтому базовая часть подобъекта не будет такой же, как внешняяBase.
например, если бы в самой Base было целое число с именем Y, то у нас был бы Y Base, но также отдельный 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++;
}