C++继承(在基类内实例化派生类)


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;
}
};

为什么子类s1不起作用?有人能告诉我我缺少什么吗?我是OOP的新手。我想在MainClass中实例化SubClass对象,但它似乎不起作用。基本上,我的目标是在Main方法中实例化MainClass对象时访问SubClass函数,比如

int Main()
{
MainClass M1("test");
M1.s1.Method_1();    <--------- this
}

第一个问题是,当您试图实例化对象时,MainClass对SubClass一无所知。

您需要使用一个正向声明和一个指针来使它工作。

头文件:

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,否则链接器会抱怨。

然而,正如"不是数字"先生正确地指出的那样,上面的编辑只会使您的代码编译。

然而,您可能实际想要的是使用virtual函数,它可以被子类重写以专门化行为。

使用实际继承的示例代码:

头文件:

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 MainClassn");
}
SubClass::SubClass(string className) : MainClass(className)
{
}
void SubClass::doSomething()
{
printf("Called from SubClassn");
}

呼叫:

int main()
{
MainClass M1("test");
SubClass sub("SubClass");
MainClass *pointer = &sub;
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.
}

要从子方法调用父方法,需要使用父类从重写中调用该方法。

示例(在子类::doSomething中(:MainClass::doSomething()

最新更新