C++指针与类的问题

原程序在末尾。

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