gpt4 book ai didi

c++ - static_cast 如何影响虚函数调用?

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

我有以下代码(从 virtual functions and static_cast 窃取):

#include <iostream>

class Base
{
public:
virtual void foo() { std::cout << "Base::foo() \n"; }
};

class Derived : public Base
{
public:
virtual void foo() { std::cout << "Derived::foo() \n"; }
};

如果我有:

int main()
{
Base base;
Derived& _1 = static_cast<Derived&>(base);
_1.foo();
}

打印输出将是:Base::foo()

但是,如果我有:

int main()
{
Base * base;
Derived* _1 = static_cast<Derived*>(base);
_1->foo();
}

打印输出将是:Segmentation fault: 11

老实说,我不太明白这两个。有人可以根据上述示例解释 static_cast 和虚拟方法之间的复杂性吗?顺便说一句,如果我希望打印输出为“Derived::foo()”,我该怎么办?

最佳答案

指向指针或引用类型的有效 static_cast 根本不会影响虚拟调用。虚拟调用根据对象的动态类型进行解析。 static_cast 到指针或引用不会改变实际对象的动态类型。

不过,您在示例中观察到的输出是无关紧要的。这些例子简直被打破了。

第一个产生无效的static_cast。在基础对象不是 Derived 的情况下,您不能将 Base & 转换为 Derived &。任何执行此类转换的尝试都会产生未定义的行为。

这是一个有效应用 static_cast 进行引用类型向下转换的示例

int main()
{
Derived derived;
Base &base = derived;
Derived& _1 = static_cast<Derived&>(base);
_1.foo();
}

在您的第二个示例中,由于与任何强制转换或虚拟调用无关的原因,代码已完全损坏。代码试图操纵未初始化的指针 - 行为未定义。

关于c++ - static_cast 如何影响虚函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17327586/

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