关于C++的同名函数

为什么指针指向的是派生类但是是调用基类的函数,不应该是同名隐藏(基类的函数被隐藏)从而只能调用派生类的函数吗

img

因为你这fun函数不是虚函数啊。不是虚函数就不具备多态性,实际调用哪个fun函数就看你这指针的类型来确定

java里什么都不写默认是override,而c里什么都不写默认是new,你想重写要加关键字override

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7662740
  • 这篇博客也不错, 你可以看下C++静态成员(静态成员变量、静态成员函数)与正常成员互相调用的权限问题
  • 除此之外, 这篇博客: C++ 虚函数,纯虚函数的作用和使用方法中的 虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 下面对程序作一点修改,在Student类中声明display函数时,在最左面加一个关键字virtual,即
    virtual void display( );
    这样就把Student类的display函数声明为虚函数。程序其他部分都不改动。

    结果:
    num:1001(stud1的数据)
    name:Li
    score:87.5

    num:2001 (grad1中基类部分的数据)
    name:wang
    score:98.5
    pay=1200 (这一项以前是没有的)

    虚函数实现了可以通过基类指针或引用来访问基类和派生类中的同名函数。

    C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。因此在派生类重新声明该虚函数时,可以加virtual,也可以不加

    注意:在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。

  • 您还可以看一下 朱有鹏老师的朱老师C++课程第3部分3.4.模板特化与类型萃取课程中的 3.4.6.函数模板为什么不能偏特化小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    原因是同名函数的重载和隐藏规则导致了名字冲突和函数指针的指向问题。当派生类和基类有同名函数时,派生类的同名函数会隐藏基类的同名函数,此时如果用基类指针调用同名函数,就会调用基类的同名函数。解决方法是使用虚函数来让编译器动态地解析函数指针,实现多态。具体解决方法如下:

    1. 在基类函数的声明前加上virtual关键字,如下所示,表示这个函数是虚函数,可以动态绑定:

      class Base { public: virtual void func(); };

    2. 在派生类中重写同名虚函数,并用override关键字确保函数签名一致:

      class Derived: public Base { public: void func() override; };

    3. 通过基类指针调用虚函数时,动态绑定到派生类的同名函数。例如:

      Base* b = new Derived(); b->func(); // 会调用Derived中重写的func()函数。

    完整代码如下:

    #include <iostream>
    using namespace std;
    
    class Base {
    public:
        virtual void func() { cout << "Base func" << endl; }
    };
    
    class Derived: public Base {
    public:
        void func() override { cout << "Derived func" << endl; }
    };
    
    int main() {
        Base* b = new Derived();
        b->func(); // 输出:Derived func
        return 0;
    }