使用子类型重载调用函数

时间:2015-03-12 14:25:00

标签: c++ polymorphism overloading

考虑以下计划

class A {};

class B : public A {};

void fun(A v) { std::cout << "A" << std::endl; }

void fun(B v) { std::cout << "B" << std::endl; }

void call(A v) { fun(v); }

int main(int argc, char *argv[]) {
   A a;
   B b;

   call(a);
   call(b);
   fun(a);
   fun(b);
}

会打印

A
A
A
B

在第二种情况下,程序是否有办法注意到变量实际上是B,因此调用重载的fun(B),以便输出变为以下变量?< / p>

A
B
A
B

2 个答案:

答案 0 :(得分:0)

您是否有理由不希望fun加入课程?如果fun是该类的virtual方法,并且调用了A而只是v.fun(),则会找到执行的正确实现

答案 1 :(得分:0)

选项1

您可以为call功能使用模板。

#include <iostream>

class A {};

class B : public A {};

void fun(A v) { std::cout << "A" << std::endl; }

void fun(B v) { std::cout << "B" << std::endl; }

template <typename T>
void call(T v) { fun(v); }

int main(int argc, char *argv[]) {
   A a;
   B b;

   call(a);
   call(b);
   fun(a);
   fun(b);
}

仅当fun的重载带有T类型的参数时才会编译,在您的情况下为AB

Working example

选项2

或者,您可以将这些自由函数转换为virtual类方法,并实际使用多态。

#include <iostream>

class A
{
public:
    virtual void fun() { std::cout << "A" << std::endl; }
    void call() { fun(); }
};

class B : public A
{
public:
    virtual void fun() override { std::cout << "B" << std::endl; }
};

int main(int argc, char *argv[]) {
   A a;
   B b;

   a.call();
   b.call();
   a.fun();
   b.fun();
}

Working example