C++ 静态演员-为什么在这里工作?
我有以下代码片段C++ 静态演员-为什么在这里工作?,c++,static-cast,C++,Static Cast,我有以下代码片段 class base { public: virtual void MyMethod() { std::cout << "Base MyMethod" << "\n"; } }; class der : public base { public: virtual void MyMethod() { std::cout << "Derived MyMethod" <
class base
{
public:
virtual void MyMethod()
{
std::cout << "Base MyMethod" << "\n";
}
};
class der : public base
{
public:
virtual void MyMethod()
{
std::cout << "Derived MyMethod" << "\n";
}
};
void foo(base* b)
{
der* d = static_cast<der*>(b);
d->MyMethod();
}
int main()
{
base* b = new der();
foo(b);
}
类基
{
公众:
虚拟方法()
{
标准::cout
“现在我的问题是,static\u cast
为什么在这里工作。”
没有理由认为它不起作用。类型是通过类派生来关联的,这是编译器所知道的。本质上,static\u cast
仅限于执行或撤消任何隐式转换,并且您确实有一个从der*
到base*
的隐式转换
“我读到,static\u cast
s不能通过多态类型进行转换。”
那只是胡说八道
“[snip]有人能举一个例子,说明静态强制转换
会失败,动态强制转换
会通过吗?”
struct A{virtual~A(){};
结构B{virtual~B(){};
结构T:A,B{};
自动主机()
->int
{
TO;
A&oA=o;
//B&oB=static_cast(oA);/!这不会编译不相关的类型。
B&oB=动态投影(oA);
}
通常使用动态\u cast将基指针强制转换为派生指针。这是因为基指向的对象实际上可能不是派生类型。因此,动态\u cast执行运行时检查,如果对象不兼容,则返回空指针
但是这种运行时检查会带来轻微的性能损失。如果您完全确定程序逻辑中的强制转换会成功,您可以使用静态强制转换来代替并阻止运行时检查。但是如果对象类型错误,您将得到未定义的行为。您没有使用虚拟继承…class der:public virtual base
将是虚拟继承。去掉静态类型转换
。你会得到同样的结果。静态类型转换
只要你知道动态类型就可以。@vanza我的意思是多态类型已经是一个顺序
。所以你在这里没有做任何新奇的事情。静态类型转换执行编译时发生的转换,并且一种定义良好的行为。@NeilKirk:astatic\u cast
可能涉及地址调整,在某些(大多数)情况下,地址调整必然发生在运行时。此外,在数字类型之间进行强制转换通常会改变位模式,同样也会改变许多(大多数)位模式运行时的案例。但它是定义良好的。使用相同的问题示例,但让class der:public virtual base
然后使用静态\u cast将失败,而使用动态\u cast将失败succeed@humam:关于静态\u cast
故障(或无法编译),是的,因为已知的base
对象可能具有除der
之外的其他子对象,这些子对象实际上派生自base
。这将使地址计算在编译时未知。但是“动态施法将成功,这取决于指向的实际对象。如果
dynamic_cast`任意选择了一个特定的der
子对象,而不是给出一个特定的、复杂的选择规则,当存在多个可能性时,它将失败,这将不会让人非常高兴。”。
struct A { virtual ~A(){} };
struct B { virtual ~B(){} };
struct T: A, B {};
auto main()
-> int
{
T o;
A& oA = o;
//B& oB = static_cast<B&>( oA ); //! This won't compile, unrelated types.
B& oB = dynamic_cast<B&>( oA );
}