C++之多态和虚函数
来源:互联网 发布:随机抽签软件绿色版 编辑:程序博客网 时间:2024/05/16 15:10
多态是指具有不同功能的函数可以用同一个函数名。
主要探索:
1 虚函数(纯虚函数)
2 虚基类
3 抽象类
4 虚析构函数
虚函数:
用相同形式能同时调用派生类和基类一样函数。
第一个实例,非虚函数,基类和派生类具有相同函数:
#include <iostream>#include <string>using namespace std;//声明基类class student{protected:int _num;string _name;float _score;public :student(int ,string,float); void display();};//定义基类构造函数student::student(int num,string name,float score):_num(num),_name(name),_score(score){}void student::display(){cout<<"num :"<<_num<<endl<<"name:"<<_name<<endl<<"score:"<<_score<<endl<<endl;}//派生类class graduate:public student{private:float _pay;public:graduate(int,string,float,float);//声明和基类相同函数void display();};graduate::graduate(int num,string name,float score,float pay):_pay(pay),student(num,name,score){}void graduate::display(){cout<<"num :"<<_num<<endl<<"name :"<<_name<<endl<<"score:"<<_score<<endl<<"pay :"<<_pay<<endl<<endl;}int main(){student stu(100,"buyingfei",100);graduate gra(1000,"buyafei",120,10000);student *pt=&stu;pt->display();pt=&gra;pt->display(); //输出结果是基类一部分stu.display();return 0;}
运行结果:
第二个实例,使用虚函数
#include <iostream>#include <string>using namespace std;//声明基类class student{protected:int _num;string _name;float _score;public :student(int ,string,float); virtual void display();};//定义基类构造函数student::student(int num,string name,float score):_num(num),_name(name),_score(score){} void student::display(){cout<<"num :"<<_num<<endl<<"name:"<<_name<<endl<<"score:"<<_score<<endl<<endl;}//派生类class graduate:public student{private:float _pay;public:graduate(int,string,float,float);//声明和基类相同函数 virtualvoid display();};graduate::graduate(int num,string name,float score,float pay):_pay(pay),student(num,name,score){}void graduate::display(){cout<<"num :"<<_num<<endl<<"name :"<<_name<<endl<<"score:"<<_score<<endl<<"pay :"<<_pay<<endl<<endl;}int main(){student stu(100,"buyingfei",100);graduate gra(1000,"buyafei",120,10000);student *pt=&stu;pt->display();pt=&gra;pt->display(); stu.display();return 0;}
运行结果:
抽象类:
不用它生成对象,作为基类去建立派生类,凡是包含纯虚函数的类都是抽象类。
#include <iostream>#include <string>using namespace std;//定义抽象类class people{public :virtual void getMessage()const=0; //定义纯虚构函数};class student:public people{protected:int _num;string _name;float _score;public :student(int ,string,float); virtual void getMessage() const;};student::student(int num,string name,float score):_num(num),_name(name),_score(score){} void student::getMessage() const{cout<<"num :"<<_num<<endl<<"name:"<<_name<<endl<<"score:"<<_score<<endl<<endl;}class graduate:public student{private:float _pay;public:graduate(int,string,float,float);//声明和基类相同函数virtualvoid getMessage() const{cout<<"num :"<<_num<<endl<<"name :"<<_name<<endl<<"score:"<<_score<<endl<<"pay :"<<_pay<<endl<<endl;}};graduate::graduate(int num,string name,float score,float pay):_pay(pay),student(num,name,score){}int main(){student stu(100,"buyingfei",100);graduate gra(1000,"buyafei",120,10000);student *pt=&stu;pt->getMessage();pt=&gra;pt->getMessage(); stu.getMessage(); return 0;}
运行结果:
虚基类:
如果一个派生类有多个直接基类,而这些基类又有一个共同基类,则派生类简介保存共同基类的多份数据成员,虚基类则解决这问题。不是在声明基类时说明的,而是在声明派生类继承方式时指出的。
如class 派生类名 :virtual 继承方式 基类名。
虚析构函数:
派生类的对象从内存中撤销,一般先调用派生类析构函数,然后在调用基类析构函数,
但是通过new 运算符建立临时对象,若基类存在析构函数,并且定义指向基类的指针变量,通过delete 撤销对象时,不会执行派生类的析构函数。
这时建立虚析构函数。
普通对象析构函数调用
#include <iostream>#include <string>using namespace std;class student{protected:int _num;string _name;float _score;public :student(int ,string,float); virtual void getMessage() const;~student(){ cout<<"destructor student"<<endl;}};student::student(int num,string name,float score):_num(num),_name(name),_score(score){} void student::getMessage() const{cout<<"num :"<<_num<<endl<<"name:"<<_name<<endl<<"score:"<<_score<<endl<<endl;}class graduate:public student{private:float _pay;public:graduate(int,string,float,float);//声明和基类相同函数virtualvoid getMessage() const{cout<<"num :"<<_num<<endl<<"name :"<<_name<<endl<<"score:"<<_score<<endl<<"pay :"<<_pay<<endl<<endl;}~graduate(){ cout<<"destory graduate"<<endl;}};graduate::graduate(int num,string name,float score,float pay):_pay(pay),student(num,name,score){}int main(){student stu(100,"buyingfei",100);graduate gra(1000,"buyafei",120,10000);//student *pt=&stu;//pt->getMessage();//pt=&gra;//pt->getMessage(); gra.getMessage();stu.getMessage(); return 0;}
运行结果:
析构函数不是虚函数:
#include <iostream>#include <string>using namespace std; class point { public : point(){} ~point(){ cout<<"destory point"<<endl; } }; class circle:public point { public: circle(){} ~circle(){ cout<<"destory circle"<<endl; } };int main(){ point *p=new circle; delete p; //这时并没有调用派生类析构函数return 0;}
运行结果:
基类析构函数是虚构函数:
#include <iostream>#include <string>using namespace std; class point { public : point(){} virtual ~point(){ cout<<"destory point"<<endl; } }; class circle:public point { public: circle(){} virtual ~circle(){ cout<<"destory circle"<<endl; } };int main(){ point *p=new circle; delete p;return 0;}
运行结果:
- C++之多态和虚函数
- C++之多态和虚函数
- 总结之多态和虚函数
- C++之多态和虚函数
- C++之多态和虚函数
- c++学习之多态(虚函数和纯虚函数)
- C+学习之多态篇(虚函数)
- <C++略识>之多态和虚函数
- 虚函数之多态讲解
- C++学习之多态篇(纯虚函数和虚函数的区别)
- 学习笔记之多态与虚函数
- C++之多态与虚函数
- C++笔记之多态中的虚函数
- VS之多态虚函数的实现
- OOP之多态 【C#】
- objective-c之多态
- objective-c之多态
- C++学习之多态篇(纯虚函数和接口类)
- ubuntu server 分区方案
- 堆排序
- JS实用图片无缝滚动
- 类在什么时候加载和初始化
- js求时间差
- C++之多态和虚函数
- 外链的建设方法和一些建议
- 《Linux程序设计第四版》第三章文件操作 读书笔记(二)
- 类加载器的工作原理
- 夜谭spring的运行原理
- Maven仓库汇总
- Nginx配置优化详解
- Java程序员应该知道的10个面向对象理论
- android:descendantFocusability用法简析