gpt4 book ai didi

c++ - 当基从非多态变为多态时派生类上的static_cast

转载 作者:搜寻专家 更新时间:2023-10-31 01:21:14 25 4
gpt4 key购买 nike

我正在审查 C++ 转换运算符,我有以下疑问:

对于多态类

  • 我应该使用 polymorphic_cast
  • 我永远不应该使用 static_cast,因为向下转换可能会带来未定义的行为。无论如何,代码都会编译这种情况。

现在假设我有以下情况

class CBase{};
class CDerived : public CBase{};

int main( int argc, char** argv ){
CBase* p = new CDerived();
//.. do something
CDerived*pd = static_cast<CDerived*>( p );
}

因为不涉及多态性,所以我不会使用 polymorphic_cast,代码甚至不会编译。

如果在某个时候,有人在继承树中引入了一些virtual 函数,而我现在意识到了这一点,那么我就处于危险之中:我如何才能实现它?

我应该移动到 polymorphic_cast 以避免任何风险,但代码仍将在没有任何通知的情况下进行编译。

您如何实现此类更改或防止这些情况发生?

谢谢AFG

最佳答案

您没有包括的背景 - boost 有 polymorphic_cast作为 dynamic_cast<> 的包装类型转换失败时抛出。 static_cast<>如果您确定数据是您要转换为的类型,那很好......有或没有虚拟成员都没有问题,并且你包含的代码说它不会编译将编译并运行得很好是。

我猜您正在考虑意外转换为另一个派生类的可能性?这就是类型转换的效用/危险,不是吗?您可以添加一个虚拟析构函数,然后使用 dynamic_cast<>,因为严格来说 RTTI 仅适用于具有一个或多个虚函数的类型。

用 static_cast<> 编写的代码将继续安全地处理相同的类型,而不管是否引入了虚函数……只是如果您开始将该代码传递给其他类型(即不是 CDerived 或任何公开派生的类型),那么您将需要 dynamic_cast<> 或其他一些更改来防止不兼容的操作。

关于c++ - 当基从非多态变为多态时派生类上的static_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4012943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com