#include<iostream>
using namespace std;
class Base{
protected:
int a,b;
public:
Base(int x=2,int y=3){ a=x; b=y; }
virtual void show() { cout<<a<<b; }
virtual void print() { cout<<a+b; }
};
class Derived:public Base{
public:
void show(int n=4) { cout<<a+b+n; }
void print() { cout<<a*b; }
};
int main(void)
{
Base *p=new Derived;
p->show();
p->print();
delete p;
system("pause");
return 0;
}
为什么调用的show 的函数是类Base里的,而不是类Derived里的?望指教,感谢回复!
1.不是同一函数
在基类Base中,show()函数的参数列表为空,并且被声明为虚函数‘virtual’,虚函数可以被派生类重写。但是在派生类Derived中,show()函数带有一个额外的参数int n,因此它与基类中的show()函数不是同一个函数。
2.调用虚函数
当通过基类指针调用虚函数时,实际调用的函数取决于指针所指向的对象的类型。由于指针p指向的是派生类Derived的对象,所以会调用派生类中与基类虚函数匹配的函数。但是在派生类Derived中并没有与基类中的虚函数匹配的函数,因此会使用基类Base中的虚函数。
gpt
在这段代码中,show() 函数被定义为虚函数,并且在 Base 类和 Derived 类中都有重写。
当你通过基类指针 p 调用 p->show() 时,实际上会调用 Base 类中的 show() 函数。这是因为通过基类指针调用虚函数时,编译器会根据对象的实际类型来确定应该调用哪个版本的虚函数。
虽然 p 的静态类型是Base*,但它指向的实际对象是 Derived类的一个实例。尽管Derived类中也存在一个重载版本的show()函数,但由于基类指针对象的实际类型是Derived`,所以编译器还是会优先选择基类中的虚函数。
如果你想要调用 Derived 类你可以将基类中的 show() 函数声明为虚函数并提供一个重写版本,在 Derived 类中再次重写 show() 函数并相应地调用它。
因为 Derived 中 你没有对 Base类中 没有参数的 show函数的重写, 你只定义了一个 带参数的 show函数,那 p指针调用 show函数,自然还是 Base类中的 无参的show函数了
因为虚函数声明与父类中不一致
建议你看看这个 2.2 节
https://blog.csdn.net/weixin_44488341/article/details/130475972