gpt4 book ai didi

具有继承的 C++ 动态转换

转载 作者:行者123 更新时间:2023-11-30 05:25:23 25 4
gpt4 key购买 nike

#include <iostream>

using namespace std;

class A
{
public:
void foo() { cout << "foo in A" << endl; }
};

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


int main() {
A* a = new B;
a->foo(); // will print "foo in A" because foo is not virtual
B* b = new B;
b->foo(); // will print "foo in B" because static type of b is B

// the problem
A* ab;
ab = dynamic_cast<B*>(new B);
ab->foo(); // will print "foo in A" !!!!!
}

'dynamic_cast' 不会改变 ab 的静态类型吗?我的意思是,从逻辑上讲,它相当于 B* ab = new B;因为类型转换..但事实并非如此。
我认为动态转换会改变对象的静态类型,我错了吗?如果是这样,有什么区别:

A* ab = dynamic_cast<B*>(new B);

A* ab = new B;  

谢谢

最佳答案

您正在 dynamic_casting 到 B,但是在分配给 ab 时,您正在隐式转换回 A,因此 dynamic_cast 再次丢失。

ab 指向的对象的实际类型仍然是 B,但是访问该对象的指针是 A 类型,因此选择了 A::foo。不过,如果 foo 是虚拟的,情况就会有所不同。

关于具有继承的 C++ 动态转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38279657/

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