【C++】物件函式的覆蓋、過載、多型
阿新 • • 發佈:2018-11-01
覆蓋 Coverage
在基類中定義了一個非虛擬函式,然後在派生類中又定義了一個同名同參數同返回型別的函式,既是覆蓋
在派生類物件上直接呼叫這個函式名,則只會呼叫派生類中的同名函式
#include <iostream>
using namespace std;
class A
{
public:
void ShowMessage();
};
class B: public A
{
public:
void ShowMessage();
};
void A :: ShowMessage()
{
cout << "This is A." << endl;
return;
}
void B :: ShowMessage()
{
cout << "This is B." << endl;
return;
}
int main()
{
A* p;
B q;
*p = q;
p -> ShowMessage();
q.ShowMessage();
return 0;
}
輸出
This is A.
This is B.
過載 Reload
在同一個作用域內,當有兩個或多個函式名相同的函式,但是函式的形參列表(指引數的個數、型別或者順序)不同
在呼叫相同函式名的函式時,根據形參列表確定到底該呼叫哪一個函式
#include <iostream>
using namespace std;
class A
{
public:
void ShowMessage();
void ShowMessage(string str);
};
void A :: ShowMessage()
{
cout << "This is A." << endl;
return;
}
void A :: ShowMessage(string str)
{
cout << str << endl;
return;
}
int main()
{
A p;
p.ShowMessage();
p.ShowMessage("How are you?");
return 0;
}
輸出
This is A.
How are you?
多型 Polymorphism
多型按字面的意思就是多種形態,是上述中唯一採用動態繫結技術的一種情況
當類之間存在層次結構,並且類之間是通過繼承關聯時,就會用到多型
在基類中定義了一個虛擬函式,然後在派生類中又定義一個同名同參數表的函式,即是多型
呼叫哪個函式並不由函式的引數表決定,而是會根據呼叫函式的物件型別來執行不同的函式:
如果物件是基類物件,則會呼叫基類中的函式;
如果物件是派生類物件,則會呼叫派生類中的函式
形成多型必須具備三個條件:
必須存在繼承關係;
繼承關係必須有同名虛擬函式;
存在基類型別的指標或者引用,通過該指標或引用呼叫虛擬函式
#include <iostream>
using namespace std;
class A
{
public:
virtual void ShowMessage();
};
class B: public A
{
public:
void ShowMessage();
};
void A :: ShowMessage()
{
cout << "This is A." << endl;
return;
}
void B :: ShowMessage()
{
cout << "This is B." << endl;
return;
}
int main()
{
A* p;
p = new A();
p -> ShowMessage();
p = new B();
p -> ShowMessage();
return 0;
}
輸出
This is A.
This is B.
虛擬函式
虛擬函式是在基類中使用關鍵字 virtual 宣告的函式
在派生類中重新定義基類中定義的虛擬函式時,會告訴編譯器不要靜態連結到該函式
我們想要的是在程式中任意點可以根據所呼叫的物件型別來選擇呼叫的函式,這種操作被稱為動態連結
純虛擬函式
在基類中定義虛擬函式,以便在派生類中重新定義該函式更好地適用於物件
如果不想在基類中對虛擬函式給出有意義的實現,這個時候就會用到純虛擬函式
class A
{
public:
// pure virtual function
virtual void ShowMessage() = 0;
};
“= 0”告訴編譯器,函式沒有主體,上面的虛擬函式則是純虛擬函式
References
[1] C++覆蓋、過載、多型區別
[2] C++ 過載運算子和過載函式
[3] C++ 多型
希望能夠對大家有所幫助~