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

标签 c++ inheritance

<分区>

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

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

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

例子:

example.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);
};

例子.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()
    */
}

最佳答案

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

不管怎样,您都必须推迟计算,直到派生类的构造函数被输入。如果我理解您要正确执行的操作,最好的方法可能是为基类提供一个成员函数来进行计算并从派生类的构造函数中调用它。

关于c++ - 如何从 C++ 中的基类构造函数调用派生类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27105403/

相关文章:

c# - C# 和 C++ 之间的编码,以及责任的杂耍

c++ - 如何用多态实现数据局部性?

c++ - 有没有办法使用strcpy将一个字符串数组复制到另一个字符串或另一个数组中?

java - 无法编译已实现接口(interface)的抽象类

javascript - 在Javascript中扩展继承的原型(prototype)方法

c++ - 如何混淆本地变量?

c++ - 引用 const 临时对象的意外行为

python - isinstance python返回不同的值

c# - 覆盖属性的访问器

database-design - 使用 CTP4 Code First 的外键作为 EF4 中的 TPH 鉴别器