- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在审查 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/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!