隐式转换 - 使用哪种转换

7

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

class Child : public Base, public AnotherBase
{
};

我有一个名为foo(Base* b)的函数,在IT技术方面有关联。我还实例化了Child* c。然后我调用了foo(c)

编译器在这里进行了隐式转换。但是它采用了C风格的转换、static_cast<Base*>或其他什么?


1
C++编译器执行隐式转换,该链接会告诉你所需的一切(尽管快速浏览它很难理解和阅读)。 - Some programmer dude
那么如果我的老板已经写了 foo(static_cast<Base*>(c)),我能安全地去掉 static_cast 吗? - user5363114
是的,指向子类的指针总是可以隐式转换为指向基类的指针。 - Some programmer dude
4
@HompMomper 或许你有另一个接收 AnotherBase* 参数的重载函数,这就是为什么它被声明为显式的原因吗? - Piotr Skotnicki
不,我们没有另一个重载。也许曾经有过。 - user5363114
1个回答

5
static_cast和C风格的转换是程序员显式请求类型转换的方式。您的示例是标准的隐式转换,而不是显式转换。
您的示例称为派生到基类转换,并在标准的[conv.ptr]/2中定义:
引用如下:

N3337: “指向cv D”类型的prvalue,其中D是一个类类型,可以转换为“指向cv B”类型的prvalue,其中BD的基类。如果BD的不可访问或模棱两可的基类,则需要进行此转换的程序是不良形式的。转换的结果是指向派生类对象的基类子对象的指针。空指针值转换为目标类型的空指针值。

换句话说,D*始终可以隐式转换为具有相同constvolitile限定符的B*

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接