如何在向下投射时静态投射,导致物体切片?如下面的情况;
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
}
};
答案 0 :(得分:2)
你不是阉割,你的上升(某种程度)。
它导致切片,因为static_cast<Parent>(*this)
通过复制Parent
创建了一个新的临时*this
对象。它基本上等同于以下内容:
Parent{*this}.draw();
根据C ++标准:
表达式static_cast(v)的结果是将表达式v转换为类型T的结果。如果T是左值引用类型或对函数类型的右值引用,则结果为左值;如果T是对象类型的右值引用,则结果为xvalue; 否则,结果是prvalue 。 static_cast运算符不应抛弃constness。
...
- prvalue是一个表达式,其评估初始化一个对象或一个位字段,或者计算一个操作符的操作数的值,由它出现的上下文指定。
...