考虑以下计划
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
答案 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
类型的参数时才会编译,在您的情况下为A
或B
。
选项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();
}