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)
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那里没有任何子对象。所以演员阵容失败了。