Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 静态演员-为什么在这里工作?_C++_Static Cast - Fatal编程技术网

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:a
static\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 );
}