多態性與虛函數
一、多態性
派生類對象可以替代基類對象為基類的引用初始化或賦值。
函數的多態性其實就是對函數不同形式的聲明的一種靈活應用。比如說,我們同名不同參數的函數就是對函數的一種多態性表現;同名同參就是函數的覆蓋;如果我們用不同類型的參數和個數來聲明不同或相同的函數,那麼程序會根據我們調用實參的個數和類型進行匹配調用之前聲明的函數模型,進行運算求值。
二、虛函數
在類的繼承層次結構中,在不同的層次中可以出現同名同參(類型、個數)都相同的函數。在子類中調用父類的成員方法,可以使用子類對象調用時使用父類的作用域實現。
虛函數的作用是允許在派生類中重新定義與基類同名的函數,並且可以通過基類指針或引用來訪問基類和派生類中的同名函數。
舉一個實例來說明使用虛函數與不使用虛函數的區別,基類和派生類中都有同名函數。
不使用虛函數:
- //
- // Student.h
- // Programs
- //
- // Created by bo yang on 4/17/12.
- // Copyright (c) 2012 __MyCompanyName__. All rights reserved.
- //
-
- #ifndef Programs_Student_h
- #define Programs_Student_h
- using namespace std;
-
- class Student
- {
- public:
- Student(int ,string,float);
- void display();
- protected:
- int num;
- string name;
- float score;
- };
-
-
- #endif
- //
- // Student.cpp
- // Programs
- //
- // Created by bo yang on 4/17/12.
- // Copyright (c) 2012 __MyCompanyName__. All rights reserved.
- //
-
- #include <iostream>
- #include <string>
- #include "Student.h"
- using namespace std;
-
- //定義構造函數
- Student::Student(int n,string nam,float s)
- {
- num=n;
- name=nam;
- score=s;
- }
-
- void Student::display()
- {
- cout<<"num:"<<num<<"\n name:"<<name<<"\n score:"<<score<<"\n"<<endl;
- }
- //
- // Graduate.h
- // Programs
- //
- // Created by bo yang on 4/17/12.
- // Copyright (c) 2012 __MyCompanyName__. All rights reserved.
- //
-
- #ifndef Programs_Graduate_h
- #define Programs_Graduate_h
- #include "Student.h"
- #include <string.h>
- using namespace std;
-
- class Graduate:public Student
- {
- public:
- Graduate(int ,string ,float,float);
- void display();
- private:
- float pay;
- };
-
-
- #endif
- //
- // Graduate.cpp
- // Programs
- //
- // Created by bo yang on 4/17/12.
- // Copyright (c) 2012 __MyCompanyName__. All rights reserved.
- //
-
- #include <iostream>
- #include "Graduate.h"
- #include "Student.h"
- using namespace std;
-
- 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)
- {
-
- }
- //
- // main.cpp
- // Student&Graduate
- //
- // Created by bo yang on 4/17/12.
- // Copyright (c) 2012 __MyCompanyName__. All rights reserved.
- //
-
- #include <iostream>
- #include "Student.h"
- #include "Graduate.h"
- using namespace std;
-
- int main(int argc, const char * argv[])
- {
-
- Student s1(1000,"David",100);
- Graduate g1(2000,"Jarry",50,20);
-
- Student *p=&s1;
- p->display();
-
- p=&g1;
- p->display();
- return 0;
- }