多態:按字面的意思就是多種形態。當類之間存在層次結構,並且類之間是通過繼承關聯時,就會用到多態。C++ 多態意味着調用成員函數時,會根據調用函數的對象的類型來執行不同的函數。
定義:如果類中定義了virtual聲明,那麼這個類就爲抽象類,需要繼承不可實例化,但可以定義成指針。
接口與抽象類區別:接口是一個概念。它在C++中用抽象類來實現,在Java中用interface來實現。抽象類即可以包含數據成員也可以包含方法(在Java中通過abstract聲明爲抽象類或者抽象方法)。他們都不可被實例化。
虛函數:是在基類中使用關鍵字 virtual 聲明的函數。在派生類中重新定義基類中定義的虛函數時,會告訴編譯器不要靜態鏈接到該函數。我們想要的是在程序中任意點可以根據所調用的對象類型來選擇調用的函數,這種操作被稱爲動態鏈接,或者後期綁定。
虛函數示例:
#include <iostream>
#define H(a,b) a+b
#define M(a,b) a>b?(a-b):(b-a)
using namespace std;
class A {
protected:
int a;
int b;
public:
A(int a,int b){
this->a = a;
this->b = b;
}
//去掉virtual修飾的話,operation() 函數在程序編譯期間就已經設置好了,這靜態鏈接。去掉,用virtual修飾成爲動態鏈接操作。
virtual int operation(){
cout<<"father operation"<<endl;
}
};
class Addition:public A{
public:
Addition(int a,int b):A(a,b){}
int operation(){
cout<<"I'm is Addition operation"<<endl;
return (H(a,b));
}
};
class Subtraction:public A{
public:
Subtraction(int a,int b):A(a,b){};
int operation(){
cout<<"I'm is Subtraction operation"<<endl;
return (M(a,b));
}
};
int main()
{
int b;
Addition Addition1(7,10);
Subtraction Subtraction1(7,10);
A* p;
p = &Addition1;
b = p->operation();
cout<<"Addition :"<<b<<endl;
p = &Subtraction1;
b = p->operation();
cout<<"Subtration :"<<b<<endl;
return 0;
}
純虛函數:您可能想要在基類中定義虛函數,以便在派生類中重新定義該函數更好地適用於對象,但是您在基類中又不能對虛函數給出有意義的實現,這個時候就會用到純虛函數。
純虛函數示例:
#include <iostream>
using namespace std;
class A{
public:
int b;
A(){};
//純虛函數用virtual修飾 =0
virtual void get_a(int &c) = 0;
};
class a:public A{
public:
void get_a(int &c){
b = c;
cout<<"b ---:"<<b<<endl;
}
};
int main(){
int n = 10;
A *p;
a a1;
a1.get_a(n);
p = &a1;
p->get_a(n);
return 0;
}
包含純虛函數或虛函數都爲抽象類,如果子類不重寫父類純虛函數,其子類也是抽象類,不可實例化,所以子類必須重寫父類純虛函數。