gpt4 book ai didi

c++ - 什么时候在构造函数中调用虚函数是安全的

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:42 25 4
gpt4 key购买 nike

我有一些代码,我真的想从构造函数中调用虚方法。我知道这被认为是不安全的,而且我对对象构造的了解也足以理解 why .我也没有遇到 these problems .目前我的代码正在运行,我认为它应该没问题,但我想确认一下。

这是我正在做的:

我有一些类层次结构,并且有一个普通的公共(public)函数,它像往常一样只是转发到一个私有(private)虚方法。但是我确实想在构造我的对象时调用这个公共(public)方法,因为它会将所有数据填充到对象中。我将绝对确定这个虚拟调用来自叶类,因为从类层次结构的任何其他部分使用这个虚拟方法根本没有意义。

所以在我看来,一旦我进行虚拟调用,对象创建就应该完成,一切都应该没问题。还有什么可能出错的地方吗?我想我必须用一些重要的注释来标记这部分逻辑,以解释为什么永远不应该将此逻辑移动到任何基类,即使它看起来可以移动。但除了其他程序员的愚蠢之外,我应该没问题,不是吗?

最佳答案

在构造函数或析构函数中调用任何非抽象虚函数是绝对安全的!但是,它的行为可能会令人困惑,因为它可能不会按预期进行。在执行类的构造函数时,对象的静态和动态类型就是构造函数的类型。也就是说,虚函数将永远不会分派(dispatch)到进一步派生类的重写。除此之外,虚拟调度实际上是有效的:例如当通过基类指针或引用调用虚函数时,会正确地分派(dispatch)到当前正在构造或析构的类中的重写。例如(可能有很多拼写错误,因为我目前无法编写此代码):

#include <iostream>
struct A {
virtual ~A() {}
virtual void f() { std::cout << "A::f()\n"; }
void g() { this->f(); }
};
struct B: A {
B() { this->g(); } // this prints 'B::f()'
void f() { std::cout << "B::f()\n"; }
};
struct C: B {
void f() { std::cout << "C::f()\n"; } // not called from B::B()
};

int main() {
C c;
}

也就是说,如果您不希望将虚函数分派(dispatch)给进一步的派生函数,则可以在类的构造函数或析构函数中直接或间接调用虚函数。您甚至可以这样做,因为虚函数在给定的类中是抽象的,只要它被定义即可。但是,将未定义的抽象函数分派(dispatch)到将导致运行时错误。

关于c++ - 什么时候在构造函数中调用虚函数是安全的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8948058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com