C样式强制转换可以处理的转换,但C++强制转换不能

Mik*_*ail 8 c c++ casting

据说 C风格的演员只是试图应用不同的C++演员组合,并且使用了第一个允许的组合.但是,我有一种感觉,我听说有些情况只有C风格的强制转换可以处理,而C++强制转换的组合都不允许.

我错了吗?在任何上下文(在C++中)中的任何 C样式转换都可以用适当的C++转换组合替换,这是真的吗?

UPD感谢Cheers和hth.- Alf,我们有一个C++强制转换无法处理的例子,它们不能产生定义预期的行为.高级问题是提供一个C++强制转换无法处理意义甚至无法编译的示例?

Che*_*Alf 11

转换为不可访问的基数只能表示为C样式转换(语法变体之一).在该上下文中,它等同于a static_cast,它可以改变地址,除了static_cast不能访问基地.

例:

struct Base
{
    int x = 42;
};

struct Oh_my
    : private Base
{
    virtual ~Oh_my() {}
};

#include <iostream>
using namespace std;
auto main() -> int
{
    Oh_my o;
    cout << "C cast: " << ((Base&)o).x << endl;
    cout << "reinterpret_cast: " << reinterpret_cast<Base&>(o).x << endl;
}
Run Code Online (Sandbox Code Playgroud)

在Windows 7中使用MingW g ++输出:

C cast: 42
reinterpret_cast: 4935184

但由于它是非常未定义的行为,最后的输出操作可能会崩溃.

  • 它与@hvd的多重继承相同,*实际上*确保(或至少一个)基础子对象与最派生对象不在同一地址. (4认同)
  • 虚拟析构函数的目的是什么?如果我删除它,我得到两个强制转换相同的输出. (2认同)