将派生类转换为基类时,dynamic_cast失败

时间:2019-03-23 08:51:46

标签: c++ inheritance

在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

第一季度:

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

第二季度:

第三种情况。编译期间发生错误

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

此错误是什么意思?

1 个答案:

答案 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的派生版本。

您应该阅读有关基类和派生类的更多信息。