曾想上 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条)

报告相同问题?