gpt4 book ai didi

基类和继承类之间的C++函数重载

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:43:13 26 4
gpt4 key购买 nike

考虑下面的例子。我猜想因为 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::funcB 中可见,写一个 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

Live Demo

关于基类和继承类之间的C++函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37585781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com