基类指针指向派生类对象,实函数与虚函数的调用问题

基类指针pBase指向派生类对象basePlus,基类与派生类含有同名同参的函数,pBase调用函数应该调用哪个,当函数有虚函数时又该调用哪个?

  • 基类指针pBase指向派生类对象basePlus时,基类与派生类都含有同名同参函数且是一虚一实,pBase调用他们中的实函数
  • 基类与派生类都含有同名同参函数,且都是实函数时,调用的是基类的函数。
  • 基类与派生类都含有同名同参函数,且都是虚函数时,调用的是派生类的函数。

(1)基类与派生类都含有同名同参函数,基类的函数是虚函数,派生类是实函数

#include <iostream>
using namespace std;

class Base
{
public:
	virtual int fun(char i[30])
	{
		cout << "调用基类函数" << endl;
		return sizeof(i);
	}
};

class BasePlus : public Base
{
public:
	int fun(char i[30])
	{
		cout << "调用派生类函数" << endl;
		return sizeof(i);
	}
};
int main() {
	BasePlus d;   
	Base* b = &d;
	char i[20];
	cout << b->fun(i) << endl;
	return 0;
}

输出:

调用派生类函数
4	

(输出为4的原因是int fun(char i[30])中的i不是数组名,而是一个指针,指针在64位系统中为4个字节)

(2)基类与派生类都含有同名同参函数,基类的函数是实函数,派生类是虚函数

#include <iostream>
using namespace std;

class Base
{
public:
	int fun(char i[30])
	{
		cout << "调用基类函数" << endl;
		return sizeof(i);
	}
};

class BasePlus : public Base
{
public:
	virtual int fun(char i[30])
	{
		cout << "调用派生类函数" << endl;
		return sizeof(i);
	}
};
int main() {
	BasePlus d;   
	Base* b = &d;
	char i[20];
	cout << b->fun(i) << endl;
	return 0;
}

输出:

调用基类函数
4

由(1)(2)得出结论:基类指针pBase指向派生类对象basePlus时,基类与派生类都含有同名同参函数且是一虚一实,pBase调用他们中的实函数。

(3)基类与派生类都含有同名同参函数,且都是实函数

#include <iostream>
using namespace std;

class Base
{
public:
	int fun(char i[30])
	{
		cout << "调用基类函数" << endl;
		return sizeof(i);
	}
};

class BasePlus : public Base
{
public:
	int fun(char i[30])
	{
		cout << "调用派生类函数" << endl;
		return sizeof(i);
	}
};
int main() {
	BasePlus d;   
	Base* b = &d;
	char i[20];
	cout << b->fun(i) << endl;
	return 0;
}

输出:

调用基类函数
4

结论:基类与派生类都含有同名同参函数,且都是实函数时,调用的是基类的函数。
(4)基类与派生类都含有同名同参函数,且都是虚函数

#include <iostream>
using namespace std;

class Base
{
public:
	virtual int fun(char i[30])
	{
		cout << "调用基类函数" << endl;
		return sizeof(i);
	}
};

class BasePlus : public Base
{
public:
	virtual int fun(char i[30])
	{
		cout << "调用派生类函数" << endl;
		return sizeof(i);
	}
};
int main() {
	BasePlus d;   
	Base* b = &d;
	char i[20];
	cout << b->fun(i) << endl;
	return 0;
}

输出:

调用派生类函数
4

结论:基类与派生类都含有同名同参函数,且都是虚函数时,调用的是派生类的函数。

  • 13
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值