无法横向动态施放

Log*_*uff 3 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
}
Run Code Online (Sandbox Code Playgroud)

T.C*_*.C. 6

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
Run Code Online (Sandbox Code Playgroud)

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

在你的情况下,e是一个Editable. ReadOnly那里没有任何子对象。所以演员阵容失败了。