从基础到派生的转换需要通过 static_cast 或 dynamic_cast 进行显式转换 . 当基数是虚拟的时,只适用后者 . 此外, dynamic_cast 只能用于多态类型 . 总之,两者似乎表明,由于涉及的类型不是多态的,因此将虚拟基数转换为派生实际上是不可能的 . 这是真的?
static_cast
dynamic_cast
动态/静态强制转换仅适用于指针和引用 .
当基础是虚拟的时,静态和动态投射都适用 .
class Base { public: virtual ~Base() {}; }; class Derived : public Base { }; int main(int argc, char **argv) { Base *b = nullptr; Derived *d = nullptr; d = dynamic_cast<Derived *>(b); d = static_cast<Derived *>(b); return 0; }
问题的第二部分:如果基数是虚拟的,则派生类型是多态的 . 你究竟是什么意思?
您对该标准的解释似乎是正确的 .
但是我愿意争辩说这没关系,因为你假设的虚拟基础与非虚拟析构函数是一个等待发生的灾难,当有人试图以多态方式删除它并因为析构函数是非虚拟的而导致未定义的行为 .
2 回答
动态/静态强制转换仅适用于指针和引用 .
当基础是虚拟的时,静态和动态投射都适用 .
问题的第二部分:如果基数是虚拟的,则派生类型是多态的 . 你究竟是什么意思?
您对该标准的解释似乎是正确的 .
但是我愿意争辩说这没关系,因为你假设的虚拟基础与非虚拟析构函数是一个等待发生的灾难,当有人试图以多态方式删除它并因为析构函数是非虚拟的而导致未定义的行为 .