隐式铸造 - 使用哪种铸造

时间:2015-10-13 08:02:24

标签: c++

假设我有一个基类和子类以及一些多重继承:

class Child : public Base, public AnotherBase
{
};

和一个函数foo(Base* b)。我还实例化了Child* c。然后我拨打foo(c)

编译器在此处进行隐式转换。但它需要一个C风格的演员表,static_cast<Base*>还是别的什么?

1 个答案:

答案 0 :(得分:5)

static_cast和C风格的强制转换是程序员明确要求进行类型转换的方式。您的示例是标准的隐式转换,它是单独描述的,而不是根据显式转换。

您的示例称为派生到基础转换,并在标准[conv.ptr]/2中定义:

  

N3337: 类型为“指向 cv D的指针”的prvalue,其中D是类类型,可以转换为prvalue类型为“指向 cv B的指针”,其中BD的基类。如果B无法访问或D的模糊基类,需要这种转换的程序是不正确的。转换的结果是指向派生类对象的基类子对象的指针。空指针值将转换为目标类型的空指针值。

换句话说,D*始终可以隐式转换为具有相同B*const资格的volitile