从基础到派生的转换需要通过static_cast
或dynamic_cast
进行显式转换。当基数是虚拟的时,只适用后者。此外,dynamic_cast
只能用于多态类型。总之,两者似乎表明,由于涉及的类型不是多态的,因此将虚拟基数转换为派生几乎是不可能的。这是真的吗?
答案 0 :(得分:2)
您对该标准的解释似乎是正确的。
然而,我愿意争辩说这并不重要,因为你假设的虚拟基础与非虚拟析构函数是一个等待发生的灾难,当有人试图以多态方式删除它并触及未定义的行为,因为析构函数是非虚拟的。
答案 1 :(得分:-1)
动态/静态强制转换仅适用于指针和引用。
当基数为虚拟时,静态和动态投射均适用。
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;
}
问题的第二部分:如果基数是虚拟的,则派生类型是多态的。你究竟是什么意思?