c++ 多态、虚函数、虚析构函数
2017-07-14 17:13
387 查看
1.若某种语言只支持类但不支持多态,则只能称为基于对象,不能说是面向对象。
2.多态:向不同对象发送同一个消息,不同的对象会产生不同的行为,发送消息可以是调用函数等操作。函数重载、运算符重载都是多态。
3.多态分为静态和动态:
静态多态性:函数重载和运算符重载(实质也是函数重载),编译时就知道调用哪个函数;
动态多态性:编译时不知道调用哪个函数,运行时才知道,是要通过虚函数实现的。
4.虚函数:当父类指针指向子类时,只能调用子类中的父类部分,但是如果父类中的某个成员函数被声明为虚函数时,该指针就可以调用子类中的子类部分了。实际上也是先指向子类中的父类部分,但是因为子类中的父类部分已经被声明为虚函数,所以不会被调用,而是调用子类中被重写的父类虚函数,就是取而代之了。对于虚函数都是通过指针、引用来调用的,通过对象名调用的话不用虚函数。
5.一个成员函数被声明为虚函数时,其子类中的同名函数都自动成为虚函数,不用每层声明都加virtual,但一般每层声明都加!
6.父类中的非虚函数在子类中也可能被重新定义,如果使用父类指针调用就会调用父类的成员函数,如果使用子类指针调用就会调用子类的成员函数,这并不是多态,因为指针类型不同,跟虚函数无关。
7.虚析构函数:一定要给多态继承的父类加上虚析构函数,原因是如果不这么做会造成delete其父类指针时造成诡异的对象局部销毁,而对象的销毁不完全,就是造成内存泄漏的原因。
虚析构函数一般都跟new delete有关,
e.g. 父类:point,子类:circle,
point *p=new circle;
delete p;
此时只会执行point的析构函数,不会执行circle的析构函数,会内存泄漏。
若声明point的析构函数为虚函数,则delete p会先执行circle的析构函数,再执行point的析构函数。
8.纯虚函数:父类中完全用不到,子类中能用到的函数。
定义方式:virtual 函数类型 函数名(参数列表)=0;
//没有函数体!!!
//“=0”只是一种形式,没啥意义;
//只有名字,没有功能,不能被调用,只是为了给子类做准备。
2.多态:向不同对象发送同一个消息,不同的对象会产生不同的行为,发送消息可以是调用函数等操作。函数重载、运算符重载都是多态。
3.多态分为静态和动态:
静态多态性:函数重载和运算符重载(实质也是函数重载),编译时就知道调用哪个函数;
动态多态性:编译时不知道调用哪个函数,运行时才知道,是要通过虚函数实现的。
4.虚函数:当父类指针指向子类时,只能调用子类中的父类部分,但是如果父类中的某个成员函数被声明为虚函数时,该指针就可以调用子类中的子类部分了。实际上也是先指向子类中的父类部分,但是因为子类中的父类部分已经被声明为虚函数,所以不会被调用,而是调用子类中被重写的父类虚函数,就是取而代之了。对于虚函数都是通过指针、引用来调用的,通过对象名调用的话不用虚函数。
5.一个成员函数被声明为虚函数时,其子类中的同名函数都自动成为虚函数,不用每层声明都加virtual,但一般每层声明都加!
6.父类中的非虚函数在子类中也可能被重新定义,如果使用父类指针调用就会调用父类的成员函数,如果使用子类指针调用就会调用子类的成员函数,这并不是多态,因为指针类型不同,跟虚函数无关。
7.虚析构函数:一定要给多态继承的父类加上虚析构函数,原因是如果不这么做会造成delete其父类指针时造成诡异的对象局部销毁,而对象的销毁不完全,就是造成内存泄漏的原因。
虚析构函数一般都跟new delete有关,
e.g. 父类:point,子类:circle,
point *p=new circle;
delete p;
此时只会执行point的析构函数,不会执行circle的析构函数,会内存泄漏。
若声明point的析构函数为虚函数,则delete p会先执行circle的析构函数,再执行point的析构函数。
8.纯虚函数:父类中完全用不到,子类中能用到的函数。
定义方式:virtual 函数类型 函数名(参数列表)=0;
//没有函数体!!!
//“=0”只是一种形式,没啥意义;
//只有名字,没有功能,不能被调用,只是为了给子类做准备。
相关文章推荐
- 从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图
- 虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图
- 从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图
- 从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图 .
- 从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图
- C++ 虚函数-多态的执行
- C++:类的多态与虚函数的使用
- C++虚函数和多态
- C++多态实现(虚函数,成员函数覆盖、隐藏)
- C++ 多态,虚函数
- C++学习笔记-----存在多态调用时,为基类定义虚析构函数
- c++ 多态 虚函数 析构函数 抽象类
- C++ 程序设计 Week6 多态和虚函数
- C++ 虚函数,多态的两个例子
- C++中类的多态与虚函数的使用
- c++中的重载操作符和虚函数实现多态
- C++ 虚函数 多态
- c++学习之多态(虚函数和纯虚函数)
- c++学习之多态(虚函数和纯虚函数)
- 读书笔记-Thinking in C++-第15章 多态和虚函数