繁体   English   中英

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

[英]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

Q1:

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

Q2:

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM