gpt4 book ai didi

c++ - 将派生类转换为基类时 dynamic_cast 失败

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

在 Primer c++ 5th 中

Markdown

class A {
public:
A() : a(1) {}
virtual ~A() = default;
private:
int a;
};
class B : public A {
public:
B() : b(2) {}
private:
int b;
};
class C : public B {
public:
C() : c(3) {}
private:
int c;
};
//class D : public B, public A { cause error
// public:
// D() : d(4) {}
// private:
// int d;
//};

int main()
{

//A *pa = new C;
//B *pb = dynamic_cast<B*>(pa); //1st case
B *pb = new B;
C *pc = dynamic_cast<C*>(pb); //2nd case
cout << pc << endl;
//A *pa = new D;
//B *pb = dynamic_cast<B*>(pa); //3rd case
}
//output: 0 cast failure

问题1:

在上面的代码中。我可以理解为什么第二种情况不起作用,但是pb指向对象的类型是B,它是C的公共(public)基类。这是Primer c++中所说的第二种情况。
那么,为什么第二种情况不起作用,而 primer c++ 说这种转换会成功?

问题2:

第三种情况。编译时出现错误

error: ‘A’ is an ambiguous base of ‘D’

这个错误是什么意思?

最佳答案

在您的第二个示例中,您创建了一个类 B,B 是 C 的基类。

因此您不能将基类转换为某个派生类。

这会起作用:

 B *pb = new C();
C *pc = dynamic_cast<C*>(pb);

关于第三个示例,D 派生自 B 和 A,但 B 也派生自 A,这会给编译器带来问题。你尝试为 A 派生 2 次,编译器将不知道要使用什么函数 A,基 A 或 B 的派生版本。艾尔

您应该阅读更多关于基类和派生类的内容。

关于c++ - 将派生类转换为基类时 dynamic_cast 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55312120/

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