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

标签 c++

考虑下面的例子。我猜想因为 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/

相关文章:

c++ - 为什么不鼓励在堆上创建 std::string/std::map?

python - 在 python bindings/clang 中的 get-includes 中解析 cpp 文件时过滤目录

c++ - 一个随机数生成器,可以在<一秒内得到不同的数字

c++ - 异常未通过 RCF 正确传递(使用 Boost.Serialization)

c++ - OpenCV/C++ 中的优化帮助

c++ - CMake 链接库在 Docker 镜像中失败

c++ - 反转字符串

c++ - 跳过元素缓冲区中的索引

c++ - 为什么 auto 不能用于重载函数?

c++ - Git 挂起的更改不起作用