Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从C+;中的基类构造函数调用派生类方法+;?_C++_Inheritance - Fatal编程技术网

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

C++ 如何从C+;中的基类构造函数调用派生类方法+;?,c++,inheritance,C++,Inheritance,我有一个基类和两个派生类。基类构造函数在调用时应该计算一些属性,尽管这些属性取决于派生类的详细信息。为了避免在每个派生类构造函数中重新编码相同的步骤,我在基类构造函数中对这些步骤进行编码,如下例所示 问题是,当我这样做时,基类构造函数不会调用重写的方法。相反,它调用自己的方法。有办法解决这个问题吗?虽然这也有道理,但这种行为发生的原因是什么 来自C#背景,这很奇怪,因为它在那里会很好地工作。在C#中,我将使用关键字base调用任何基类方法,而this将始终调用派生类方法 例如: 示例.h #de

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

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

来自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);
};

没有办法做到这一点,因为当运行基类构造函数时,对象还不是派生类型的对象。特别是,在基类构造函数运行之前,派生类中引入的数据成员不会初始化——本质上,基类对象的行为类似于派生类的数据成员


无论如何,您将不得不推迟计算,直到输入派生类的构造函数。如果我理解您试图正确执行的操作,最好的方法可能是为基类提供一个执行计算的成员函数,并从派生类的构造函数调用该函数。

构造函数和析构函数是
虚拟
功能不起作用的唯一位置。
因为
派生的
对象尚未构造,调用
派生的
函数将导致未定义的行为。对于析构函数,
派生的
对象已被析构函数

这一点在本文中进行了解释


剩下的唯一方法是让对象得到构造,然后调用
方法()

你说这是唯一的例外-但是析构函数呢?@ltjax,在析构函数中,要启动的
虚拟
功能没有问题。它按预期工作。@molbdnilo,ltjax,你说得对。我错过了那部分。编辑。
#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;
}
int main()
{
    Base* d = new Derived();

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