原程序在末尾。
int main()
{
D d; //D是派生类
B *pb = &d; //B是基类
D *pd = &d;
pb->fl(1.23); //语句 1
pd->fl(1.23); //语句 2
pb->f2(1.23); //语句 3
pb->f3(1.23); //语句 4,此处为啥调用基类????
pd->f3(3.14); //语句 5,此处为啥调用派生类??
system("pause");
return 0;
}
我的问题是,语句4、5的调用问题。
现在脑瓜有很多问号???
本来理解的是,语句4/5调用派生类的函数。因为看到D定义的指针,在B定义的指针后面
而且指针名也相同,应该会覆盖前一个语句吧。但结果。。这是C++实验问答题
就是问,为啥出现这种结果。现在附上代码:
#include< iostream>
using namespace std;
class B {
public:
virtual void fl(double x)
{
cout <<"B::f1(double)"<< x << endl; //单输出x值
}
void f2(double x)
{
cout << "B::f2(double)" << 2 * x << endl; //输出2倍x
}
void f3(double x)
{
cout << "B::f3(double)" << 3 * x << endl; //输出3倍x
}
};
class D :public B { //B的派生类
public:
virtual void fl(double x)
{
cout << "D::f1(double)" << x << endl;
}
void f2(int x)
{
cout << "D::f2(int)" << 2 * x << endl; //强制转换x到int,再2x。这个想法是错的,
} //由于基类存在输入double型,故输入double,会调用基类f2
void f3(double x)
{
cout <<"D::f3(double)"<< 3 * x << endl;
}
};
int main()
{
D d; //D是派生类
B *pb = &d; //B是基类
D *pd = &d;
pb->fl(1.23); //语句 1
pd->fl(1.23); //语句 2
pb->f2(1.23); //语句 3
pb->f3(1.23); //语句 4
pd->f3(3.14); //语句 5
system("pause");
return 0;
}
望大佬,解答解答,谢谢
virtual跟多态有关,加了virtual关键字的函数,在调用的时候 ,如果子类有 就先调用子类的, 如果子类没有 ,就调用父类的。
父类指针指向子类对象的时候,如果调用的函数,在父类中和子类中都存在,但在父类中不是虚函数,在子类中是不是虚函数均可,用父类指针调用的时候,会执行父类中的函数,而不是子类中的函数;用子类指针调用的时候,会执行子类中的函数。
以上,如有帮助,请采纳一下,谢谢。
简单来说就是基类的函数f3没有定义为虚函数,所以也不会被派生类的同名函数覆盖。
只有虚函数被覆盖的时候才会利用虚函数指针查找虚函数表,然后再找到对应的函数。
很简单啊,f3不是虚函数啊
您的问题已经有小伙伴解答了,请点击【采纳】按钮,采纳帮您提供解决思路的答案,给回答的人一些鼓励哦~~
ps:开通问答VIP,享受5次/月 有问必答服务,了解详情↓↓↓
【电脑端】戳>>> https://vip.csdn.net/askvip?utm_source=1146287632
【APP 】 戳>>> https://mall.csdn.net/item/52471?utm_source=1146287632