# 父类指针指向子类对象

本文详细探讨了C++中基类指针指向子类对象时调用成员函数的情况。当基类没有定义虚函数,通过基类指针只能访问基类的函数。然而,虚函数的存在打破了这一限制,使得通过基类指针能够根据实际对象类型调用相应的成员函数,实现了多态。文中通过实例展示了虚函数如何影响函数调用,并分析了不同情况下的调用逻辑,包括函数调用链及虚函数的继承特性。
摘要由CSDN通过智能技术生成

父类指针指向子类对象

基类中没有定义虚函数时

1.如果以一个基础类指针指向一个衍生类对象(派生类对象),那么经由该指针只能访问基础类定义的函数

2.如果以一个衍生类指针指向一个基础类对象,必须先做强制转型动作(explicit cast),这种做法很危险,也不符合生活习惯,在程序设计上也会给程序员带来困扰。(一般不会这么去定义)

3.如果基础类和衍生类定义了相同名称的成员函数,那么通过对象指针调用成员函数时,到底调用那个函数要根据指针的原型来确定,而不是根据指针实际指向的对象类型确定。

但是虚拟函数就是为了对“如果你以一个基础类指针指向一个衍生类对象,那么通过该指针,你只能访问基础类定义的成员函数”这条规则反其道而行之的设计。

当基类中定义虚函数时

当存在虚函数时,调用的函数(前提是他在基类中被声明为虚)将根据指针指向的对象的类型确定。
举例如下:

class A
{
public:
	virtual void fa(){	cout << "fa" << endl;}
	void fa2(){	cout << "fa2" << endl;}};
class B :public A
{
public:	
	void fa(){	cout << "fb" << endl;}
	void fa2(){	cout << "fb2" << endl;}};
class C :public B
{
public:	
	void fa(){	cout << "fc" << endl;	}
	void fa2(){	cout << "fc2" << endl;}};
int  main()
{
	A *ptr = new C;
	ptr->fa();
	ptr->fa2();
	delete ptr;
	return 0;
}

在基类A中函数fa为虚,实际上在派生类B、C中,fa一直是一个虚函数,只是“virtual”被省略掉了,fa2不为虚;因此当A类指针ptr指向C类对象时,ptr->fa()将调用实际指向的对象类型C的fa函数,即输出fc;ptr->fa2()将调用指针的原型,即类型A的fa函数,即输出fa2;
注:若类C中没有定义fa函数,则ptr->fa(),将调用类型B的fa函数,即输出fb。

若改为以下代码:

#include <iostream>
using namespace std;
class A
{
public:
	virtual void fa()
	{
		cout << "fa" << endl;
		fa2();
	}
	virtual void fa2()
	{
		cout << "fa2" << endl;
	}
};
class B :public A
{
public:
	void fa()
	{
		cout << "fb" << endl;
		fa2();
	}
	void fa2()
	{
		cout << "fb2" << endl;
	}
};
class C :public B
{
public:
	/*void fa()
	{
		cout << "fc" << endl;
		fa2();
	}*/
	void fa2()
	{
		cout << "fc2" << endl;
	}
};
int  main()
{
	
	A *ptr = new C;
	ptr->fa();
	ptr->fa2();
	delete ptr;
	return 0;
}

1)ptr->fa();将调用ptr实际指向的对象类型C的fa,但C没有定义fa函数,故调用函数B的fa函数,输出fb,然后调用fa2函数,虽然此时this指针属于类B,但由于fa2函数为虚函数,将调用ptr实际指向的对象类型C的fa2函数,输出fc2

2)若fa2函数在基类中没有声明为虚,则ptr->fa();将调用ptr实际指向的对象类型C的fa,但C没有定义fa函数,故调用函数B的fa函数,输出fb,然后调用fa2函数, this指针属于类B,调用B的fa2函数,输出fb2.

3)若fa2函数在基类中没有声明为虚,而在C中声明为虚,则仍为2)中的结果。

转载请标注来源

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值