c++ - 不能向侧面动态施放

标签 c++ polymorphism dynamic-cast

我偶然发现了从派生类到派生类的横向转换,并发现了我的知识差距。直到现在,我一直生活在一个可以做到这一点的世界里。相反,std::bad_cast 被抛出。这是怎么回事?

#include <iostream>

class Base
{
protected:
    int x_;

public:
    Base(int x) : x_(x) {}
    virtual ~Base() = default;
    int x() const { return x_; }
    virtual void setX(int x) = 0;
};

class Editable : public Base // class implements setters
{
public:
    Editable(int x) : Base(x) {}
    void setX(int x) { x_ = x; }
};

class ReadOnly : public Base // class implements empty setters
{
public:
    ReadOnly(int x) : Base(x) {}
    void setX(int x) {}
};

int main()
{
    Editable editable(4);
    ReadOnly &readOnly = dynamic_cast<ReadOnly&>(editable); // std::bad_cast
}

最佳答案

这就是人们说 dynamic_cast 可以横向转换的意思:

struct A { virtual ~A() = default; };
struct B { virtual ~B() = default; };
struct D : A, B {};

B* pb = new D();
A* pa = dynamic_cast<A*>(pb); // OK

即,它允许您将 B* 转换为 A*,如果指针指向从 A 派生的东西和 B。要使转换成功,仍然必须有一个 A 子对象供指针指向(或绑定(bind)到的引用,如果要转换为引用类型)。

在您的例子中,e 是一个Editable。那里的任何地方都没有 ReadOnly 子对象。所以转换失败。

关于c++ - 不能向侧面动态施放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29587835/

相关文章:

c++ - 了解带有常量的预处理器宏

c++ - 从基类调用指定方法

c - C 中的数据隐藏,多态行为?

c++ - 我应该更改我的设计以防止动态转换吗?

C++ - 改进复数数学的计算时间

javascript - 在 Nan::ObjectWrap C++ 类中存储 JavaScript 实例的正确方法

c++ - 在 C++ 中的 Windows 串行端口上设置 low_latency 标志

c# - 防止继承链中的虚拟和覆盖

c++ - 使用 dynamic_cast 而不是传统的多态有什么优势?

c++ - 一般如何从 void * 指针动态转换?