考虑下面的例子。我猜想因为 func
是虚拟的,所以调用哪个实现的决定将在运行时根据实例类型(类型 B)和参数类型(short 或 int)完成
然而,在运行这段代码后,我得到了意想不到的结果,指针类型只决定了跳转哪个函数,这完全打破了我对多态性的基本假设...
这引出了一个问题,我在哪里可以将 2 func 实现与函数重载联系起来?
谁能告诉我是什么原因导致了这个结果? 谢谢
class A {
public:
virtual void func(short x) { printf("A::func %d\n", x); }
};
class B : public A {
public:
virtual void func(int x) { printf("B::func %d\n", x); }
};
int main(void)
{
int n=2;
short m=3;
A* a = new B;
a->func(n);
a->func(m);
B* bp = new B;
bp->func(n);
bp->func(m);
}
//output is :
//A::func 2
//A::func 3
//B::func 2
//B::func 3
最佳答案
如果派生类有一个函数与基类中的函数同名,则基类函数被隐藏。如果你想让 A::func
在 B
中可见,写一个 using-declaration:
class B : public A {
public:
using A::func; //here
virtual void func(int x) { printf("B::func %d\n", x); }
};
现在的输出是:
A::func 2
A::func 3
B::func 2
A::func 3
关于基类和继承类之间的C++函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37585781/