[英]C++ Inheritance (instantiating derived class inside base class)
class MainClass
{
string _ClassName;
public:
string MainClass(string _C)
{
_ClassName = _C;
}
SubClass s1;
};
class SubClass : public MainClass
{
public:
string Method_1()
{
return a;
}
string Method_2()
{
return a;
}
};
为什么 SubClass s1 不起作用有人能告诉我我错过了什么吗?我是 OOP 的新手。 我想在 MainClass 中实例化 SubClass object 但它似乎不起作用。 基本上,我的目标是在 Main 方法中实例化 MainClass object 时访问 SubClass 函数,如下所示:
int Main()
{
MainClass M1("test");
M1.s1.Method_1(); <--------- this
}
第一个问题是,当您尝试实例化 object 时,MainClass 不知道有关 SubClass 的任何事情。
您需要使用前向声明和指针来使其工作。
Header 文件:
class SubClass; //Forward declaration, allows pointer.
class MainClass
{
string _ClassName;
public:
MainClass(string _C); //No return type on constructor
~MainClass();
SubClass *s1; //Size: 4 Bytes on 32bit system
protected:
MainClass();
};
class SubClass : public MainClass
{
public:
string Method_1();
string Method_2();
};
CPP 文件:
#include "headerFile.h"
MainClass::MainClass(string _C) :
_ClassName(_C),
s1(new SubClass) //Class definition is now known.
{
}
MainClass::MainClass() : s1(nullptr) //Nullptr -> No new object, no infinite recursion.
{
}
MainClass::~MainClass()
{
delete s1; //Do not forget to clean up your pointer.
}
string SubClass::Method_1()
{
return "a";
}
string SubClass::Method_2()
{
return "a";
}
称呼:
int main()
{
MainClass M1("test");
M1.s1->Method_1(); //-> to dereference the pointer.
}
第二个问题,正如 Richard Critten 所指出的,是无限递归,它会导致你的程序很快崩溃。
每次实例化一个子类时,您还创建了一个子类,该子类又创建了另一个 MainClass 等。
为了避免这种情况,您需要一个受保护的构造函数,它不会创建子类成员。
第三个问题:您在方法中返回a
,这表明了一个变量。 如果您打算返回“a”,则需要将它们放在引号中。
最后,为了让它编译,你需要用一个小的m
( int main()
) 编写Main
,否则 linker 会抱怨。
但是,正如“不是数字”先生所说的那样,上述编辑只会使您的代码编译。
然而,您实际上可能会使用virtual
函数,它可以被子类覆盖以专门化行为。
使用实际 inheritance 的示例代码:
Header 文件:
class MainClass
{
string _ClassName;
public:
MainClass(string _C); //No return type on constructor
virtual ~MainClass(); //All base classes that have at least one virtual method should also have a virtual destructor, even if it is empty.
virtual void doSomething();
};
class SubClass : public MainClass
{
public:
SubClass(string className);
void doSomething();
};
CPP 文件:
#include "headerFile.h"
#include <stdio.h>
MainClass::MainClass(string _C) : _ClassName(_C)
{
}
MainClass::~MainClass()
{}
void MainClass::doSomething()
{
printf("Called from MainClass\n");
}
SubClass::SubClass(string className) : MainClass(className)
{
}
void SubClass::doSomething()
{
printf("Called from SubClass\n");
}
称呼:
int main()
{
MainClass M1("test");
SubClass sub("SubClass");
MainClass *pointer = ⊂
M1.doSomething(); //Outputs 'Called from MainClass'.
sub.doSomething(); //Outputs 'Called from SubClass'.
pointer->doSomething(); //Also outputs 'Called from SubClass', since it points to sub and because sub overrides the behaviour from MainClass.
}
要从子方法调用父方法,您需要使用父 class 从覆盖内调用该方法。
示例(在 SubClass::doSomething 中): MainClass::doSomething()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.