C++基础笔记(六) 多态和虚函数

笔记来源:51CTO学习网站
C++基础笔记(六)

多态和虚函数

1.实例
父类CStudent,派生类Cleader;
父类和派生类中分别定义了同名函数Print();
父类中保护的成员数据为五个,派生类新增成员数据由一个;
使用CStudent的指针数组,来分别指向CStudent与CLeader对象;
使用循环,将CStudent
数组指向的对象信息打印出来。

int main()
{
	CStudent *arrStu[2];
	CStudent stu("Tony",22);
	stu.AddCourse(4,89);
	stu.AddCourse(3,90);
	arrStu[0]=&stu;
	CLeader leader("Aimly",23,true,"Fast");
	leader.AddCourse(4,89);
	leader.AddCourse(3,90);
	arrStu[1]=&leader;
	for(int i=0;i<2;i++)
	{
		arrStu[i]->Print();
	}
	return 0;
}

-输出结果却是父类的打印类型,原因是由于指针的类型是父类的缘故;
-然而,我们对父类中的Print()方法和派生类中Print()方法前面加上virtual这个修饰符【即从void Print()---->virtual void Print()】后,我们再次运行程序,这个时候的打印结果就是分别会运行两个类中的Print()方法,打印出派生类中新增成员数据。
2.多态性的概念
-在编译时就能确定哪个函数被调用的,称为先期联编。而这种在运行时,能依据其类型确认调用哪个函数的能力,称为多态性;
-多态性是指发出同样的消息被不同类型的对象接手时有可能导致完全不同的行为。
3.静态绑定与动态绑定
-绑定:程序自身彼此关联的过程,确定程序中的操作调用与执行该操作的代码间的关系;
-静态绑定(静态联编):联编工作出现在编译阶段,用对象名或者类名来限定要调用的函数;
-动态绑定:联编工作在程序运行时执行,在程序运行时才确定将要调用的函数。
4.虚函数
为了指明某个函数具有多态性,用关键字virtual来标志其为虚函数。在类的声明中,在函数原型之前写virtual。
virtual 返回值 函数名(参数列表);
-virtual只用来说明声明中的原型,不能用在函数实现中;
-基类中声明了虚函数,派生中无论是否说明,同原型函数都自动为虚函数
-虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的,简称V-Table;
-V-Table主要是一个类的虚函数地址表,所以,当用父类的指针来操作一个子类时,虚函数表就像一个地图一样,指明了实际所应该调用的函数
-编译器将虚函数表的指针存放于对象实例的开头,通过对象的地址即可得到这张虚函数表,通过遍历其函数指针,即可调用相应的函数。
-虚函数按其声明顺序放于表中。父类的虚函数在子类的虚函数前面。
-编译通常是在先期联编状态下工作的,只有看到虚函数,才把它作为迟后联编来实现。
-本质:不是重载声明而是覆盖
-调用方式:通过基类指针或引用,执行时会根据指针指向的对象的类,决定调用哪个函数
-虚函数设置说明:
-只有类的成员函数才能说明为虚函数。虚函数仅适用于继承关系的类的对象;
-静态成员函数不能是虚函数,因为静态成员函数不受限于某个对象;
-内联函数、构造函数不能是虚函数;
-析构函数可以是虚函数,通常声明为虚函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值