首页 > 其他分享 >d有相同名类方法重载不适用于基类

d有相同名类方法重载不适用于基类

时间:2022-10-02 22:06:56浏览次数:65  
标签:struct void fun Base 基类 重载 class 名类


​原文​​​ 仅在基类上​​提供​​正确​​重载​​,而派生类上包含​​不正确​​重载时,编译器不会检查​​基类重载​​.如果​​派生类​​没有任何重载,则它可以工作.例如:

struct Foo
{
void foo(Bar b)
{
b.bar(this);
}
}

struct Foobar {}
struct Foobar2 {}

class Base
{
void bar(Foo f) {}
void bar(Foobar2 f) {}
}

class Bar : Base
{
void call()
{
Foo f;
f.foo(this);
}

// 注释掉,则正常工作.
void bar(Foobar f) {}
}

简化示例:

void main()
{
Derived d;
A a;
d.fun(a);
}

struct A {}
struct B {}
struct C {}

class Base
{
void fun(A a) {}
void fun(C c) {}
}

class Derived : Base
{
// 注释掉,则可调用.
void fun(B b) {}
}

因为​​Base.fun​​​和​​Derived.fun​​​位于不同的​​重载集​​​中,而​​派生类​​​重载集​​掩盖​​​了​​基类​​​重载集.用​​反射​​​检查​​重载集​​:

struct A {}
struct B {}
struct C {}

class Base
{
void fun(A a) {}
void fun(C c) {}
}

class Derived1 : Base
{
// 注释掉,调用Base.fun(A)
void fun(B b) {}
}

// 打印: tuple(fun)
pragma(msg, __traits(getOverloads, Derived1, "fun"));

class Derived2 : Base {}

// 打印:tuple(fun, fun)
pragma(msg, __traits(getOverloads, Derived2, "fun"));


标签:struct,void,fun,Base,基类,重载,class,名类
From: https://blog.51cto.com/u_4139404/5729473

相关文章