gpt4 book ai didi

c++ - 关于static_cast的问题

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

我写了一段代码,但我对它的输出感到困惑:

#include <iostream>

using namespace std;

class B{
public:
virtual void foo() {cout << "B::foo" << endl;}
};

class D:public B{
public:
virtual void foo() {cout << "D::foo" << endl;}
void disp() {cout << "D::disp" << endl;}
};

void func(B *pb){
D *pd1 = static_cast<D*>(pb);
pd1->foo();
pd1->disp();
}

int main(int argc, char *argv[])
{

B* pb = new B();
func(pb);

return 0;
}

输出是:

B::foo
D::disp

但是据我所知,pb 指向类型B。而且里面没有名为disp() 的函数?那么,为什么它可以访问 D 类中的 disp() 函数?

最佳答案

因为 disp() 不访问类的任何成员,原则上就好像它是在全局命名空间而不是在类中声明的一样,所以没有调用它的负面影响,即使实例不属于正确的类。

你正在做的是将基类的指针向下转换为派生类的指针,即使它没有这样初始化。如果 disp() 试图访问 D 但不在 B 中的类成员,您可能会遇到段错误。

底线:不要使用 static_cast 进行向下转换,除非您绝对确定指针实际上指向派生类的实例。如果你不确定,你可以使用 dynamic_cast,它会在不匹配的情况下失败(但是有 RTTI 的开销,所以尽可能避免它)。

dynamic_cast 将在转换不正确或抛出 std::bad_cast 时返回 nullptr如果它转换引用,则异常,因此您将确定它失败的原因,而不是可能的内存损坏错误。

关于c++ - 关于static_cast的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12239783/

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