虚函数与多态性

开发工具与关键技术:VS2015与 C++

撰写时间:2019/06/27

多态性:指界面相同,多种实现.
重载函数是多态性的一种简单体现形式
虚函数允许函数调用与函数体的联系在运行时才进行,称为动态联编.
静态联编:
1. 联编是指一个程序模块、代码之间互相关联的过程。
2. 静态联编,是程序匹配、连接在编译阶段实现,也称为早期匹配,重载函数使用静态联编。
3. 动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编。switch语句和if语句是动态联编的例子。
普通函数重载表达为两种形式:
1. 在说明中重载 2.基类的成员函数在派生类重载。有三种编译的方法。
(1) 根据参数的特征加以区分 hai(int,int); hai(char,int);
(2) 使用::加以区分 A::hai(); B::hai();
(3) 根据对象加以区分 A.obj() 调用 A::obj();

类指针的关系:
基类指针和派生类指针与基类对象和派生类对象4中可能匹配:
1. 直接用基类指针引用基类对象

class A{public:	A() { cout << "A" << endl; }	void setint() {};};
class C:public A{public:	C() { cout << "C" << endl; }};
void main(){ A *p; C Cobj; p = &Cobj; }

可以使用p访问到C从A继承下来的元素,但是不能访问C的自定义元素,除了使用了显式转换。
2. 直接用派生类指针引用派生类对象
3. 用基类指针引用一个派生类对象
4. 用派生类指针引用一个基类对象
派生类指针只有经过强制转换之后,才能引用基类对象。

class A{public:	A() { cout << "A" << endl; }; int a;	void setint() {};};
class C:public A{public:	C() { cout << "C" << endl; }};
void main(){ C *p; A Aobj;A *pc = (A*)p; pc = &Aobj; }

在这里插入图片描述

虚函数和动态联编:
1. 被关键字virtual修饰的成员函数称为虚函数。
2. 实现运行时多态的关键首先是要说明虚函数外、必须用基类指针调用派生类的不同实现版本。
3. 基类指针虽然获取派生类地址,但是只能访问派生类从基类继承下来的成员。

虚函数和基类指针:
1. 一个虚函数,在派生类层面相同的重载函数都保持虚特性。
2. 虚函数必须是类的成员函数
3. 不能将友元函数说明为虚函数,但虚函数可以是另一个类的友员
4. 析构函数可以是虚函数,但构造函数不能是虚函数。

(1) 在派生类中重载基类的虚函数要求函数名、返回类型、参数个数、参数类型、和顺序完全相同。
(2) 如果函数原型不同,仅函数名相同,丢失虚特性。

class A{	public:virtual void print(){};	};
class B:public A{	public:void print(){};	};

虚析构函数:
1. 构造函数不能是虚函数。建立一个派生类对象时,必须从类层次的根开始,沿着继承路逐个调用基类的构造函数。
2. 析构函数可以是虚函数。虚析构函数用于指引delete运算符正确析构动态对象。
3. 定义了基类的虚析构函数,基类指针指向的派生类动态对象也可以正确地用delete析构
4. 设计类层次结构时,提供一个虚析构函数,能够使派生类对象在不同状态下正确调用析构函数。

纯虚函数:
1. 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都要定义自己的版本。
2. 纯虚函数为各派生类提供一个公共的界面
3. 纯虚函数说明形式:
virtual 类型 函数名(参数表) = 0;
4. 一个具有纯虚函数的基类为抽象类。

class A{	public:virtual void print(){} = 0;	};
class B:public A{	public:void print(){};	};

你可能感兴趣的:(C++,C++基础)