假设我有一个基类和子类以及一些多重继承:
class Child : public Base, public AnotherBase
{
};
和一个函数foo(Base* b)
。我还实例化了Child* c
。然后我拨打foo(c)
。
编译器在此处进行隐式转换。但它需要一个C风格的演员表,static_cast<Base*>
还是别的什么?
答案 0 :(得分:5)
static_cast
和C风格的强制转换是程序员明确要求进行类型转换的方式。您的示例是标准的隐式转换,它是单独描述的,而不是根据显式转换。
您的示例称为派生到基础转换,并在标准[conv.ptr]/2
中定义:
N3337:
类型为“指向 cvD
的指针”的prvalue,其中D
是类类型,可以转换为prvalue类型为“指向 cvB
的指针”,其中B
是D
的基类。如果B
无法访问或D
的模糊基类,需要这种转换的程序是不正确的。转换的结果是指向派生类对象的基类子对象的指针。空指针值将转换为目标类型的空指针值。
换句话说,D*
始终可以隐式转换为具有相同B*
和const
资格的volitile
。