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

标签 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

问题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/

相关文章:

c++ - 计算二叉搜索树的高度

c++ - 在 C++ 中是否有替代 dynamic_cast 的方法?

java - superClass 的私有(private)成员是否由子类继承......Java?

python - 在python中访问实例变量

c++ - 派生类的 vptr 何时初始化?

C++ GetModuleFileName 访问冲突

c++ - eventfd_read/write 与 sem_wait/post

C++ 类(组合和继承 - 头文件、类数组)

java - 子类调用继承方法时会使用父类(super class)还是子类方法(Java)

c++ - 将字符串转换为字符指针