构造函数或者析构函数中调用虚函数会怎样

构造函数或者析构函数中调用虚函数会怎样


在C++中,构造函数和析构函数中调用虚函数会导致一些行为与预期不符。具体来说:

  • 构造函数中调用虚函数
    当在构造函数中调用虚函数时,调用的是当前类的版本,而不是派生类的版本。这是因为在构造函数执行期间,派生类的对象尚未完全构造完毕,因此虚函数表(vtable)还没有更新为派生类的版本
#include <iostream>

class Base {
public:
    Base() {
        std::cout << "Base constructor called." << std::endl;
        // 调用虚函数
        this->show();
    }

    virtual void show() {
        std::cout << "Base show called." << std::endl;
    }

    virtual ~Base() {
        std::cout << "Base destructor called." << std::endl;
        // 调用虚函数
        this->show();
    }
};

class Derived : public Base {
public:
    Derived() {
        std::cout << "Derived constructor called." << std::endl;
    }

    virtual void show() override {
        std::cout << "Derived show called." << std::endl;
    }

    virtual ~Derived() {
        std::cout << "Derived destructor called." << std::endl;
    }
};

int main() {
    Derived d;
    return 0;
}

输出结果:

Base constructor called.
Base show called.
Derived constructor called.
Derived destructor called.
Base destructor called.
Base show called.

析构函数中调用虚函数

类似地,当在析构函数中调用虚函数时,调用的也是当前类的版本,而不是派生类的版本。这是因为在派生类的析构函数执行后,对象的类型被认为是基类,因此虚函数表也恢复到基类的版本。

总结

构造函数中调用虚函数:调用当前类的版本,因为派生类对象还未完全构造。
析构函数中调用虚函数:调用当前类的版本,因为派生类对象已经开始析构。
这种行为是为了避免在构造和析构过程中调用尚未初始化或已经销毁的派生类成员,从而导致未定义行为。为了避免这种问题,最好避免在构造函数和析构函数中调用虚函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星光技术人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值