c++类中的虚函数
2015-07-13 16:49
260 查看
类中虚函数的作用
在介绍虚函数的作用之前,我们首先介绍下静态联编和动态联编。
注意: 当基类对象指针指向公有派生类的对象时,它只能访问从基类继承下来的成员,而不能访问派生类中定义的成员。
静态联编-编译阶段就将函数实现和函数调用关联起来。C语言中,所有联编都是静态联编。
动态联编-在程序运行阶段才将函数实现和函数调用关联起来。c++中一般都是使用静态联编,但是涉及到多态性和虚函数,就必须使用动态联编。
c++中引入虚函数就是为了实现多态性,面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为。
虚函数使用的基础是派生类和基类之间存在的赋值兼容关系。基类与派生类的赋值兼容关系体现在1)派生类对象直接向基类赋值2)派生类对象初始化基类对象引用3)派生类对象的地址直接赋给基类对象的指针4)函数形参是基类对象或基类对象的引用时,在调用函数时,可以用派生类的对象作为实参
c++类中引用虚函数就是为了实现多态性,对于不同的对象对同一消息产生不同的行为。基类中的某成员函数被声明为虚函数时,在它的派生类中可以重新定义,但是重新定义过的函数的函数名、返回类型、参数个数、参数类型的顺序都必须和基类中的原型完全相同。另外,派生类中定义可以省略关键字virtual。因为系统会根据定义的函数原型是否和虚函数原型完全一致来判断是否为虚函数。
注释几点:1、虚函数必须是所在类的成员函数而不能是友元函数,也不能是静态成员函数。2、内联函数不能是虚函数 3、构造函数不能是虚函数,析构函数可以是虚函数。4、派生类的析构函数与基类的析构函数名字不同,但是如果将基类的析构函数定义为虚函数,由该基类派生而来的所有派生类的析构函数都自动成为虚函数。
纯虚函数的一般形式:
virtual 返回类型 函数名(形参表)=0。纯虚函数不具有函数功能,不能被调用,告诉系统这是纯虚函数。纯虚函数一般定义在基类中,基类中定义的函数一般不需要实现函数功能。
在介绍虚函数的作用之前,我们首先介绍下静态联编和动态联编。
注意: 当基类对象指针指向公有派生类的对象时,它只能访问从基类继承下来的成员,而不能访问派生类中定义的成员。
静态联编-编译阶段就将函数实现和函数调用关联起来。C语言中,所有联编都是静态联编。
动态联编-在程序运行阶段才将函数实现和函数调用关联起来。c++中一般都是使用静态联编,但是涉及到多态性和虚函数,就必须使用动态联编。
c++中引入虚函数就是为了实现多态性,面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为。
虚函数使用的基础是派生类和基类之间存在的赋值兼容关系。基类与派生类的赋值兼容关系体现在1)派生类对象直接向基类赋值2)派生类对象初始化基类对象引用3)派生类对象的地址直接赋给基类对象的指针4)函数形参是基类对象或基类对象的引用时,在调用函数时,可以用派生类的对象作为实参
void function(ABCBase &base) { base.showABC(); } int main() { ABCBase base("A");//ABCbase为基类/父类 base.showABC(); X x("B");//派生类 base = x;//派生类对象直接向基类赋值 base.showABC(); ABCBase &base1 = x;//派生类对象初始化基类对象引用 base1.showABC(); ABCBase *base2 = &x;//派生类对象的地址直接赋值给基类对象的指针 base2->showABC(); function(x);//派生类的对象作为实参 return 0; }注意:派生类与基类的赋值兼容前提是派生类公有继承于基类。言而总之,使用虚函数,派生类必须是从基类公有派生。
c++类中引用虚函数就是为了实现多态性,对于不同的对象对同一消息产生不同的行为。基类中的某成员函数被声明为虚函数时,在它的派生类中可以重新定义,但是重新定义过的函数的函数名、返回类型、参数个数、参数类型的顺序都必须和基类中的原型完全相同。另外,派生类中定义可以省略关键字virtual。因为系统会根据定义的函数原型是否和虚函数原型完全一致来判断是否为虚函数。
注释几点:1、虚函数必须是所在类的成员函数而不能是友元函数,也不能是静态成员函数。2、内联函数不能是虚函数 3、构造函数不能是虚函数,析构函数可以是虚函数。4、派生类的析构函数与基类的析构函数名字不同,但是如果将基类的析构函数定义为虚函数,由该基类派生而来的所有派生类的析构函数都自动成为虚函数。
纯虚函数的一般形式:
virtual 返回类型 函数名(形参表)=0。纯虚函数不具有函数功能,不能被调用,告诉系统这是纯虚函数。纯虚函数一般定义在基类中,基类中定义的函数一般不需要实现函数功能。
相关文章推荐
- 括号匹配 c++
- c++语言常用转义序列符号
- C++实现python标准库中的Counter
- C/C++拾遗(十九):MFC - 一个简单的窗口程序
- 简单字符串模式匹配算法的C++实现
- c++链表实例与链表基本知识
- vs2013 远程调试 (c++)
- 推荐!国外程序员整理的 C++ 资源大全
- C++ 字符串编程训练5
- 简易C\C++内存池
- c++的进程和线程【windows】
- C++多线程编程简单实例
- C++ clock()函数实现功能介绍
- c语言中,指针加1的情况.指针变量详细介绍
- 学习C++的记录
- C语言中将字符串转换为整数
- C++ 拷贝构造函数
- printf的用法(此文章用于申请搜狐自媒体)作者胡金峰
- C++ 构造函数使用new
- c++变量的作用域、生存期和可见性