曾想上 2021-05-29 17:31 采纳率: 66.7%
浏览 34
已采纳

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;
}

望大佬,解答解答,谢谢

  • 写回答

4条回答 默认 最新

  • qfl_sdu 2021-05-29 17:43
    关注

    virtual跟多态有关,加了virtual关键字的函数,在调用的时候 ,如果子类有 就先调用子类的, 如果子类没有 ,就调用父类的。
    父类指针指向子类对象的时候,如果调用的函数,在父类中和子类中都存在,但在父类中不是虚函数,在子类中是不是虚函数均可,用父类指针调用的时候,会执行父类中的函数,而不是子类中的函数;用子类指针调用的时候,会执行子类中的函数。

    以上,如有帮助,请采纳一下,谢谢。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题