虚拟基础到非多态类型的派生强制转换

时间:2015-04-17 14:36:40

标签: c++ inheritance language-lawyer dynamic-cast static-cast

从基础到派生的转换需要通过static_castdynamic_cast进行显式转换。当基数是虚拟的时,只适用后者。此外,dynamic_cast只能用于多态类型。总之,两者似乎表明,由于涉及的类型不是多态的,因此将虚拟基数转换为派生几乎是不可能的。这是真的吗?

2 个答案:

答案 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;
}

问题的第二部分:如果基数是虚拟的,则派生类型是多态的。你究竟是什么意思?