- [..]
- (4.3) 如果类B直接或间接地派生自类A,则将B*转换为A*优于将B*转换为void*,而将A*转换为void*则优于将B*转换为void*。
因此,如果有以下代码:
struct A {};
struct M : A {};
struct B : M {};
void f(A*);
void f(void*);
int main()
{
B *bptr = new B();
f(bptr);
}
调用 f(bptr)
会优先选择重载 f(A*)
而不是 f(void*)
。
但在第二种情况下:A*到void*的转换比B*到void*的转换更好。这种转换如何发生?你能给我一个触发此情况的示例吗?
出于某些原因,我找不到一个应用此情况的案例或示例。这似乎像是将两个无关的事物进行比较。但我在第4.4段中遇到了更多信息。
你可以从cppreference的第4段检查整个内容:
- 如果Mid是从Base派生的(直接或间接),而Derived也是从Mid派生的
- a)Derived*到Mid*比Derived*到Base*更好
- b)Derived到Mid&或Mid&&比Derived到Base&或Base&&更好
- c)Base::*到Mid::*比Base::*到Derived:: *更好
- d)Derived到Mid比Derived到Base更好
- e)Mid*到Base*比Derived*到Base*更好
- f)Mid到Base&或Base&&比Derived到Base&或Base&&更好
- g)Mid::*到Derived::*比Base::*到Derived:: *更好
- h)Mid到Base比Derived到Base更好
void*
重载,它会走B*
->A*
->void*
的路线?在深度继承中,B*
和A*
指向不同位置时,这可能很重要。 - Filipe Rodriguesvoid f(A*,void*); void f(void*,B*); A *aptr = new A(); f(aptr,bptr);
会选择f(void*,B*)
吗? - Goswin von BrederlowB* -> A* -> void*
从一开始就是不可能的。 - user17732522