使用基类参数调用派生类参数的函数重载

时间:2015-07-22 07:35:22

标签: c++ inheritance

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

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函数必须在类

之外

2 个答案:

答案 0 :(得分:2)

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

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

很明显,这在运行时得到解决,并且具有(通常可以忽略不计)性能成本。

答案 1 :(得分:0)

你必须施放这些物体:

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

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