假设我有一个基类和一个子类,以及一些多重继承:
class Child : public Base, public AnotherBase
{
};
我有一个名为foo(Base* b)
的函数,在IT技术方面有关联。我还实例化了Child* c
。然后我调用了foo(c)
。
编译器在这里进行了隐式转换。但是它采用了C风格的转换、static_cast<Base*>
或其他什么?
假设我有一个基类和一个子类,以及一些多重继承:
class Child : public Base, public AnotherBase
{
};
我有一个名为foo(Base* b)
的函数,在IT技术方面有关联。我还实例化了Child* c
。然后我调用了foo(c)
。
编译器在这里进行了隐式转换。但是它采用了C风格的转换、static_cast<Base*>
或其他什么?
static_cast
和C风格的转换是程序员显式请求类型转换的方式。您的示例是标准的隐式转换,而不是显式转换。[conv.ptr]/2
中定义:N3337:
“指向cv D
”类型的prvalue,其中D
是一个类类型,可以转换为“指向cv B
”类型的prvalue,其中B
是D
的基类。如果B
是D
的不可访问或模棱两可的基类,则需要进行此转换的程序是不良形式的。转换的结果是指向派生类对象的基类子对象的指针。空指针值转换为目标类型的空指针值。
D*
始终可以隐式转换为具有相同const
和volitile
限定符的B*
。
foo(static_cast<Base*>(c))
,我能安全地去掉static_cast
吗? - user5363114AnotherBase*
参数的重载函数,这就是为什么它被声明为显式的原因吗? - Piotr Skotnicki