在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’
此错误是什么意思?
答案 0 :(得分:2)
在第二个示例中,您创建一个类B,B是C的基类。
因此您不能将基类转换为某些派生类。
这将起作用:
B *pb = new C();
C *pc = dynamic_cast<C*>(pb);
关于第三示例,D从B和A派生,但是B也从A派生,这给编译器带来了问题。您尝试为A派生2次,则编译器将不知道要使用哪个函数A,基本A或B的派生版本。
您应该阅读有关基类和派生类的更多信息。