Cpp--虚函数的存在
来源:互联网 发布:阿里云免费证书配置 编辑:程序博客网 时间:2024/06/05 21:55
1.虚函数基础:
定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数。
用法格式:virtual 函数返回类型 函数名(参数表) {函数体}
作用:它是实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数的基础。
#include <iostream>#include <string>using namespace std;//声明基类Studentclass Student{public: Student(int, string,float); //声明构造函数 void display( );//声明输出函数protected: //受保护成员,派生类可以访问 int num; string name; float score;};//Student类成员函数的实现Student::Student(int n, string nam,float s)//定义构造函数{ num=n; name=nam; score=s;}void Student::display( )//定义输出函数{ cout<<"num:"<<num<<"\nname:"<<name<<"\nscore:"<<score<<"\n\n";}//声明公用派生类Graduateclass Graduate:public Student{public: Graduate(int, string, float, float);//声明构造函数 void display( );//声明输出函数private:float pay;};// Graduate类成员函数的实现void Graduate::display( )//定义输出函数{ cout<<"num:"<<num<<"\nname:"<<name<<"\nscore:"<<score<<"\npay="<<pay<<endl;}Graduate::Graduate(int n, string nam,float s,float p):Student(n,nam,s),pay(p){}//主函数int main(){ Student stud1(1001,"Li",87.5);//定义Student类对象stud1 Graduate grad1(2001,"Wang",98.5,563.5);//定义Graduate类对象grad1 Student *pt=&stud1;//定义指向基类对象的指针变量pt pt->display( ); pt=&grad1; pt->display( ); return 0;}
现在用同一个指针变量(指向基类对象的指针变量),不但输出了学生stud1的全部数据,而且还输出了研究生grad1的全部数据,说明已调用了grad1的display函数。用同一种调用形式“pt->display()”,而且pt是同一个基类指针,可以调用同一类族中不同类的虚函数。这就是多态性,对同一消息,不同对象有 不同的响应方式。
2.定义虚函数的限制:
2.1 非类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数也不能定义为虚函数,但可以将析构函数定义为虚函数。实际上,优秀的程序员常常把基类的析构函数定义为虚函数。因为,将基类的析构函数定义为虚函数后,当利用delete删除一个指向派生类定义的对象指针时,系统会调用相应的类的析构函数。而不将析构函数定义为虚函数时,只调用基类的析构函数。
3.虚函数与派生类:
4.动态绑定:
5.覆盖虚函数机制:
Item_base *baseP = &derived;double d = baseP->Item_base::net_price(42);这段代码强制将net_price调用确定为Item_base中定义的版本,该调用将在编译时确定。
6.纯虚函数:
6.1 纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。6.2 纯虚函数可以让类先具有一个操作名称,而没有操作内容,让派生类在继承时再去具体地给出定义。凡是含有纯虚函数的类叫做抽象类。这种类不能声明对象,只是作为基类为派生类服务。除非在派生类中完全实现基类中所有的的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象。
6.3 在基类中实现纯虚函数的方法是在函数原型后加“=0”
6.4 纯虚函数只有函数的名字而不具备函数的功能,不能被调用。它只是通知编译系统:“在这里声明一个虚函数,留待派生类中定义”。在派生类中对此函数提供定义后,它才能具备函数的功能,可被调用。纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。如果在基类中没有保留函数名字,则无法实现多态性。如果在一个类中声明了纯虚函数,而在其派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯虚函数。(具体例程待补充)
接下来再补充一个虚函数的例子
#include "stdio.h" #include <iostream> using namespace std; class A { public: virtual void print() { cout << "A::print()" <<endl;} }; class B: public A { public: virtual void print() { cout << "B::print()" <<endl;} }; class C: public A { public: virtual void print() { cout << "C::print()" <<endl;} }; void print(A a) { a.print(); } void main() { A a,*aa,*ab,*ac; B b; C c; aa=&a; ab=&b; ac=&c; a.print(); b.print(); c.print(); aa->print(); ab->print(); ac->print(); print(a); print(b); print(c); }
纯虚函数的例子可以参考下面这个大牛的博客:http://blog.csdn.net/hackbuteer1/article/details/7558868。有问题欢迎讨论,后序待补充
- Cpp--虚函数的存在
- Cpp-虚函数
- cpp的友元函数
- 初学CPP虚函数(一)
- mianArg.cpp 使用mian函数的参数 f0512.cpp
- 【cpp】【函数】
- 虚析构函数存在的理由
- 仿函数存在的原因
- 虚函数表存在的位置,初始化时机
- 带参数的构造函数.cpp
- CPP中主函数的参数
- 获取bmp图像的函数.cpp
- 函数具体的实现 client_c2s.cpp
- cpp的函数对象和谓词
- 虚函数,纯虚函数,抽象类,点H与点CPP文件的结合
- cpp中的多态,虚函数
- Qt中一个.cpp类的函数调用另一个.cpp中类的函数的方法
- PHP下常见的检查函数(变量是否存在,文件是否存在 函数是否存在 方法是否存在)
- source insight 设置行数、加高亮
- Programming Elixir, Functional |> Concurrent |> Pragmatic |> Fun, Pragmatic 读书笔记
- Mac .bash_profile
- AMESim R14 运行时出现许可证错误
- swift 字典常用方法
- Cpp--虚函数的存在
- Orlace 数据库连接的那些事儿:服务器端(三)
- 回魂夜台词
- Sublime
- 细菌实验分组(C程序设计进阶第2周)
- oracle中的约束
- eval函数的工作原理
- LeetCode---Pascal's Triangle II
- iOS9+Swift开发经验不定期汇总(2): 企业账号应用不受信任,自定义Navigation Controller左上角返回按钮,CLLocationManager停止获取GPS等