为带有基类参数的派生类参数调用函数重载

Calling function overload for a derived class parameter with a base class parameter

本文关键字:参数 调用 函数 重载 派生 基类      更新时间:2023-10-16

我不确定我的标题是否足够冗长,但我不知道如何更好地用文字表达。基本上,我想有,例如,这些类:

class A {};
class B : public A{};
class C : public A{};

这两个函数:

void cry(B* param){ cout << "Wee"; };
void cry(C* param){ cout << "Woo"; };

和这段代码:

int main()
{
    A* weener = new B();
    A* wooner = new C();
    cry(weener);
    cry(wooner);
}

和我期望的输出:

wee
woo

但是这个,在我的例子中,它甚至不能编译。这可能吗?如果是,正确的做法是什么?
PS: cry函数必须

类之外

一个简单的解决方法是定义一个单独的cry函数,它根据参数的动态类型来选择它的行为:

void cry(A* param)
{
    if( dynamic_cast<B*>(param) ) //do something
        ;
    else if( dynamic_cast<C*>(param) ) // do something else
        ;
}

显然,这是在运行时解决的,并且伴随着(通常可以忽略不计的)性能成本。

必须强制转换这些对象:

cry(static_cast<B*>(weener));
cry(static_cast<C*>(wooner));

否则编译器将寻找以A*为参数的cry函数(因为weenerwooner确实被声明为A*的类型)。