【问题标题】:C++ Inheritance (instantiating derived class inside base class)C++ 继承(在基类中实例化派生类)
【发布时间】:2021-08-24 07:20:32
【问题描述】:
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 对象,但它似乎不起作用。 基本上,我的目标是在 Main 方法中实例化 MainClass 对象时访问 SubClass 函数,如下所示:

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

【问题讨论】:

  • SubClass is-a MainClass that contains a SubClass which is-a MainClass that contains a SubClass which is-a MainClass ...
  • 好点,我什至没有发现。
  • 您对继承的看法是错误的。 MainClassMainClass,而 SubClass 继承自 MainClass 的方法。

标签: c++ oop inheritance


【解决方案1】:

第一个问题是,当您尝试实例化对象时,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',则需要将它们放在引号中。

最后,为了让它编译,你需要用一个小的mint 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 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 = &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.
}

要从子方法调用父方法,您需要从父类的覆盖中调用该方法。

示例(在 SubClass::doSomething 中):MainClass::doSomething()

【讨论】:

  • 您编译了代码,但我认为这不是 OP 的目标。顺便说一句,它不会在运行时崩溃,但它不会编译
  • @463035818_is_not_a_number,通过编译器运行了这个东西,修复了明显的问题,并添加了一个关于如何实现实际继承的示例。你是对的,没有考虑到 OP 问题的可能意图。
  • thnks 真的帮了我很多,但我认为我想要实现的目标是创建一个结构并在主类 M1.s1.Method_1() 中实例化它;就像我想要的那样在 main() 中工作。
  • @Aveloni,我很高兴能帮上一点忙。如果您认为问题已解决,请将答案标记为“已接受”(分数下方的复选标记)。这会告诉其他人,你不再需要帮助了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2018-03-14
相关资源
最近更新 更多