基类的指针指向派生类的对象

说明:只要基类的成员函数是虚函数,派生类的同名函数(参数相同,返回值类型相同),函数体不同,不管有没有显式声明virtual都是虚函数。

派生类中virtual关键字可有可无,但是也是虚函数。

#include "stdafx.h"
#include "iostream"
using namespace std;

class A
{
	int x;
public:
	A(int i) {x=i;}
	void show()
	{
		cout<<"A class show():x="<<x<<endl;
	}
	virtual void display()
	{
		cout<<"A class virtual display():x="<<x<<endl;
	}
};

class B:public A
{
	int y;
public:
	B(int i,int j):A(i) { y=j;}
	void show()
	{
		cout<<"B class show(): y="<<y<<endl;
	}
	void display()//前面有无virtual都可以
	{
		cout<<"B class virtual display():y="<<y<<endl;
	}

};
int main(int argc, _TCHAR* argv[])
{
	A a(5),*pa;
	B b(10,20);
	pa=&b;
	pa->show();
	pa->display();
	system("pause");
	return 0;
}

结论:

基类的指针指向派生类的对象,当调用同名的成员函数时:

1)如果在基类中成员函数为虚函数,那么基类指针调用的就是派生类的同名函数。virtual void display();

     可以这么理解:因为该函数是虚的,所以会找真正实现的那个函数,所以调用派生类B中的 B class virtual display.

2)如果基类中成员函数为非虚函数,则调用的是基类的成员函数。void show();

     因为基类是非虚的,已经完全实现了,所以没有必要再调用派生类的了,就调用基类的A class show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值