![](/img/trans.png)
[英]dynamic_cast fails when cast a base class to derived class
[英]dynamic_cast fails when cast a derived class to base class
在Primer C ++ 5th中
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
在上面的代码中,我可以理解为什么第二种情况不起作用,但是指向pb的对象的类型是B
,这是C
的公共基类,这是Primer c ++中所说的第二种情况。
那么为什么第二种情况在引物c ++说这种类型的转换会成功的同时不起作用?
第三种情况。 编译期间发生错误
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的派生版本。
您应该阅读有关基类和派生类的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.