gpt4 book ai didi

c++ - 向下转换类 C++

转载 作者:搜寻专家 更新时间:2023-10-30 23:59:28 25 4
gpt4 key购买 nike

我对在 C++ 中向下转换对象有疑问。

这里有一个例子:

class A { }
class B : public A {
public:
void SetVal(int i) { _v = i; }
private:
int _v;
}

A* a = new A();
B* b = dynamic_cast<B*>(a);
b->SetVal(2);

这个例子会发生什么?我们正在修改一个基类,就像它是一个子类一样……它如何与内存相关联?

有了这个转换……是不是像创建 B 的实例并复制 A 的值一样?

谢谢

最佳答案

A* a;

这只是给你一个指向 A 的指针。它没有特别指向任何地方。它根本不指向 AB 对象。您的代码是否有效取决于它所指向的对象的动态类型。

因此,您可能想了解两种情况。首先,这个:

A* a = new A();
B* b = dynamic_cast<B*>(a);
b->SetVal(2);

这会给您带来未定义的行为,因为 dynamic_cast 将返回一个空指针。当对象的动态类型确实不是 B 时,它返回一个空指针。在本例中,对象是一个 A。然后您尝试使用 b->SetVal(2) 取消引用空指针,因此您会得到未定义的行为。

A* a = new B();
B* b = dynamic_cast<B*>(a);
b->SetVal(2);

这会很好地工作,因为该对象确实是一个 B 对象。动态转换将成功,SetVal 调用将正常工作。

但是,请注意,要使其正常工作,A 必须是多态类型。为此,它必须至少有一个虚拟成员函数。

关于c++ - 向下转换类 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16361352/

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