- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑以下代码:
struct Base {};
struct Derived : public virtual Base {};
void f()
{
Base* b = new Derived;
Derived* d = static_cast<Derived*>(b);
}
标准 ([n3290: 5.2.9/2]
) 禁止这样做,因此代码无法编译,因为 Derived
virtually 继承自 Base
。从继承中删除 virtual
使代码有效。
这条规则存在的技术原因是什么?
最佳答案
技术问题是无法根据 Base*
计算出 Base
子对象的开始与派生
对象。
在您的示例中,它看起来没问题,因为只有一个类具有 Base
基类,因此继承是虚拟的似乎无关紧要。但是编译器不知道是否有人定义了另一个 class Derived2 : public virtual Base, public Derived {}
,并且正在转换一个指向 Base 的
的子对象。通常[*],Base*
Derived2
中Base
子对象和Derived
子对象之间的偏移量可能与Base
子对象和最派生类型为 Derived
的对象的完整 Derived
对象,正是因为 Base
是虚拟的继承。
因此,无法知道完整对象的动态类型,以及您提供的指针与所需结果之间的不同偏移量,具体取决于该动态类型是什么。因此类型转换是不可能的。
您的 Base
没有虚函数,因此也没有 RTTI,因此肯定无法判断完整对象的类型。即使 Base
确实有 RTTI(我不立即知道为什么),类型转换仍然被禁止,但我猜想在这种情况下没有检查 dynamic_cast
是可能的。
[*] 我的意思是,如果这个例子不能证明这一点,那么继续添加更多的虚拟继承,直到你发现偏移量不同的情况;-)
关于c++ - 涉及虚继承的时候为什么不能用static_cast来向下转型呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42688774/
我知道 Jobs 可以通过 flink 或 flink.bat 提交给 JobManager。我想知道Flink有没有提供Java API给JobManager提交作业? 最佳答案 是的。根据您要连接
我已经将 GCM 的演示代码应用于 appache 服务器的服务器端和 android 设备的客户端,并且运行良好;但我需要在我的应用程序中激活此服务,如下所示:我在 SqlServer 上有一个数据
我需要将自定义 header 添加到 WebView 中加载的页面,但它不起作用, header 未设置: @Override public WebResourceResponse shouldInt
我是一名优秀的程序员,十分优秀!