隐式强制转换-使用哪种强制转换

Implicit casting - which cast is used

本文关键字:转换      更新时间:2023-10-16

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

class Child : public Base, public AnotherBase
{
};

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

编译器在这里进行隐式强制类型转换。但它需要c型石膏、static_cast<Base*>还是其他什么?

static_cast和c风格强制转换是程序员显式要求类型转换的方式。你的例子是一个标准的隐式转换,它是单独描述的,而不是根据显式转换。

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

N3337: 类型为"指向cv D"的右值,其中D是类类型,可以转换为类型为"指向cv B"的右值,其中BD的基类。如果BD的不可访问或有歧义的基类,则需要进行这种转换的程序是病态的。转换的结果是指向派生类对象的基类子对象的指针。将空指针值转换为目的类型的空指针值。

换句话说,D*总是隐式转换为具有相同constvolitile资格的B*