为什么指针指向的是派生类但是是调用基类的函数,不应该是同名隐藏(基类的函数被隐藏)从而只能调用派生类的函数吗
因为你这fun函数不是虚函数啊。不是虚函数就不具备多态性,实际调用哪个fun函数就看你这指针的类型来确定
java里什么都不写默认是override,而c里什么都不写默认是new,你想重写要加关键字override
下面对程序作一点修改,在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,也可以不加
注意:在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。
原因是同名函数的重载和隐藏规则导致了名字冲突和函数指针的指向问题。当派生类和基类有同名函数时,派生类的同名函数会隐藏基类的同名函数,此时如果用基类指针调用同名函数,就会调用基类的同名函数。解决方法是使用虚函数来让编译器动态地解析函数指针,实现多态。具体解决方法如下:
在基类函数的声明前加上virtual关键字,如下所示,表示这个函数是虚函数,可以动态绑定:
class Base { public: virtual void func(); };
在派生类中重写同名虚函数,并用override关键字确保函数签名一致:
class Derived: public Base { public: void func() override; };
通过基类指针调用虚函数时,动态绑定到派生类的同名函数。例如:
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;
}