如何在C ++中从基类构造函数调用派生类方法?

吉拉迪

我有一个基类和两个派生类。基类构造函数在调用时应计算一些属性,尽管这些属性取决于派生的类详细信息。为了避免在每个派生类构造函数中重新编码相同的步骤,我在基类构造函数中编码了这些步骤,如下面的示例所示。

问题是,当我这样做时,基类构造函数不会调用重写的方法。相反,它调用自己的方法。有办法解决吗?尽管这也很有意义,但这种行为发生的原因是什么?

来自C#背景,这很奇怪,因为它在那里可以很好地工作。在C#中,我将使用关键字base来调用任何基类方法,而this总是会调用派生类方法。

例子:

例子.h

#define _USE_MATH_DEFINES
#include <math.h>

class Base
{
    public:
        Base(void);
        ~Base(void);
    protected:
        virtual void Method(void);
};


class Derived : public Base
{
    public:
        Derived(void);
        ~Derived(void);
    protected:
        virtual void Method(void);
};

example.cpp

#include <iostream>

Base::Base()
{
    this->Method(); // This calls Base->Method instead of Derived->Method
}

Base::~Base(){}

void Base::Method() // If I remove this, I have an error "externals undefined"
{
    std::cout << "called Base->Method()" << endl;
}

Derived::Derived()
    : Base()
{
    this->Method(); // This obviously calls Derived->Method
}

Derived::~Derived(){}

void Derived::Method()
{
    std::cout << "called Derived->Method()" << endl;
}

main.cpp

int main()
{
    Base* d = new Derived();

    /*
    Outputs:
        called Base->Method()
        called Derived->Method()
    */
}
塞尔登

无法执行此操作,因为在运行基类构造函数时,该对象还不是派生类型的对象。特别是,直到运行基类构造函数之后,才初始化派生类中引入的数据成员-本质上,基类对象的行为类似于派生类的数据成员。

一种或另一种方式,您将不得不推迟计算,直到输入派生类的构造函数为止。如果我了解您要正确执行的操作,最好的方法可能是给基类一个成员函数,该成员函数执行计算并从派生类的构造函数中调用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用指向函数的指针在基类构造函数中调用派生类的方法?

如何在Scala中从派生类辅助构造函数调用辅助基类构造函数?

在派生类 C++ 的构造函数中调用基类的构造函数

如何在模板派生类中调用模板基类的构造函数?

C#-在派生类中调用基类和类构造函数

C ++派生类构造函数调用基类构造函数错误

如何在派生类构造函数中初始化基类成员变量?

如何使用基类的数据成员作为派生类的构造函数?(在 C++ 中)

C ++如何从多个派生类调用基类方法?

如何在python中相同的重载派生类方法中调用基类方法?

当派生类无法轻松将参数传递给基类时,如何调用基类构造函数?

如何从基类调用派生类函数?

如何避免在TypeScript,Angular2的派生类中重复基类构造函数参数?

派生类是否可以具有不在C ++基类中的构造函数?

为什么派生类的构造函数要在C ++中初始化虚拟基类?

为C ++中的基类和派生类声明“虚拟”构造函数?

如何模拟派生类调用其基类方法?

C ++:在派生类成员上调用基类方法

使用CRTP时如何调用派生类的构造函数?

未调用派生类的c ++ / cli静态构造函数

派生类指向基类对象的指针如何调用派生类的方法?

C ++继承:指向基类的派生类指针调用派生类方法

在Java中,如何从派生类中的重写方法中调用基类的方法?

如何调用在C ++中具有抽象基类和派生类的定义的基类的虚函数定义?

Javascript:在派生类中重写之前如何调用基类函数?

C# 可以让基类中的泛型函数知道调用派生类的类型吗?

您能否将派生类添加到其基类的列表中,然后从C#中的基类列表中调用派生类的方法

从基类类型的指针数组中调用派生类的方法。(C ++)

如何在基类构造函数中使用派生类成员