在C ++中进行转换时的对象切片

时间:2017-04-23 07:16:01

标签: c++ inheritance casting

如何在向下投射时静态投射,导致物体切片?如下面的情况;

class Parent{ // base class
public:
    virtual void draw();
};

class Child: public Parent{ //derived class
public:
    void draw()
    {
       static_cast<Parent>(*this).draw();
       // do other stuff
    }
};

1 个答案:

答案 0 :(得分:2)

你不是阉割,你的上升(某种程度)。

它导致切片,因为static_cast<Parent>(*this)通过复制Parent创建了一个新的临时*this对象。它基本上等同于以下内容:

Parent{*this}.draw();

根据C ++标准:

[expr.static.cast/1]

  

表达式static_cast(v)的结果是将表达式v转换为类型T的结果。如果T是左值引用类型或对函数类型的右值引用,则结果为左值;如果T是对象类型的右值引用,则结果为xvalue; 否则,结果是prvalue 。 static_cast运算符不应抛弃constness。

[basic.lval/1.2]

  

...

     
      
  • prvalue是一个表达式,其评估初始化一个对象或一个位字段,或者计算一个操作符的操作数的值,由它出现的上下文指定。
  •   
     

...