#include <iostream>
using namespace std;
class A
{
public:
virtual void funA(){
cout << "類A的funA呼叫" << endl;
}
virtual ~A() {};
};
class B : public A
{
public:
virtual void funA() {
cout << "類B的funA呼叫" << endl;
}
void funB() {
cout << "類B的funB呼叫" << endl;
}
};
int main()
{
A* obj = new B;
obj->funA();
delete obj;
return 0;
}
上面的代碼中在子類B中重寫了funA,然后用父類指標obj指向子類B,實作多型。
我的疑問是,如果我需要執行子類B中的函式funB,不是又要再創建一個B類指標嗎?
或者說,父類指標指向子類物件,只能執行父類中有的方法,但是不能執行子類中獨有的方法,那么多型的意義在哪里?
請各位大佬賜教,謝謝!
uj5u.com熱心網友回復:
不用,你的理解是錯誤的它實際是什么型別的物件,就執行什么型別的虛擬函式
uj5u.com熱心網友回復:
不用再創建B指標,指標轉換一下就可以了,因為A型別指標不認識funB,所以轉成B型別指標即可uj5u.com熱心網友回復:
那一開始就直接定義B類指標不更方便嗎?為什么還要用多型呢
uj5u.com熱心網友回復:
你這是因為完全使用了子類的特性(也就是呼叫子類特有的函式)
一開始用父類,是因為想通過共性來展現個性(也就是呼叫相同的父類的函式,達到不同的子類實作的效果)
也就是統一呼叫(有統一才能方便自動化),結果多樣化。比如
A a=new A
A b=new B
A c=new C
通過呼叫相同的函式 a.funA(); b.funA(); c.funA(),但是子類重寫了函式,所以相同的函式結果不一樣。
這類設計的好處,一時半會跟你說不清楚,你先記住用法吧,以后你見多了,自然就理解它的好處了
比如
有個函式專門測驗A(不管A是什么子類),void testA(A a) {a.funA();} ,用戶呼叫這個api的時候,傳給你的A可以各式各樣,但是只要保證繼承A(也就是擁有funA函式),那么不管傳什么樣的A物件,這個doA函式都能測驗。否則,你要寫3個方法testA{a.funA},testB{b.funB},testC{c.funC},這樣代碼不能重用,冗余繁瑣。
uj5u.com熱心網友回復:
多型記住三點,就能理解本質:1. 如樓上說的:利用共性展示個性。 這也是多型出現的原因;
2. 有虛函式,就存在動態系結。 這也實作了用基類指標可以呼叫到派生類的方法;
3. 最重呼叫的是哪個函式,是由基類指標指向的哪個派生類決定的。
uj5u.com熱心網友回復:
我記得多型有個例子,最初學習的時候:是時候再把這個例子由拿出來溫故一下了。
比如有
class 人
{
virtual void 吃飯(){} = 0//人類肯定能吃飯的。
virtual void 說話(){} = 0//人類肯定能說話的。
}
然后
上帝說要分類一下。
class 中國人:是人類
{
說話(){ 說“中文” }
}
class 日本人:是人類
{
說話(){說“日語”}
}
好了--------------------------------------------------
main()
{
有一個class 人類 某某 = 是一個日本人
某某因為是人類->所以是可以說話的吧()//因為某某確定是日本人了,
//所以 某某這個日本人說出來的話,自認是說的日語了。
}
-------------------------------------------------------
多型其實就是想解決這個問題。
uj5u.com熱心網友回復:
我記得多型有個例子,最初學習的時候:
是時候再把這個例子由拿出來溫故一下了。
比如有
class 人
{
virtual void 吃飯(){} = 0//人類肯定能吃飯的。
virtual void 說話(){} = 0//人類肯定能說話的。
}
然后
上帝說要分類一下。
class 中國人:是人類
{
說話(){ 說“中文” }
}
class 日本人:是人類
{
說話(){說“日語”}
}
好了--------------------------------------------------
main()
{
有一個class 人類 某某 = 是一個日本人
某某因為是人類->所以是可以說話的吧()//因為某某確定是日本人了,
//所以 某某這個日本人說出來的話,自認是說的日語了。
}
-------------------------------------------------------
多型其實就是想解決這個問題。
這個問題,很簡單了。
現在有一個人。
在某個情況下需要說話。
可以直接 某某->說話。
不需要關心他是日本人還是中國人,亦或是法國人...
因為虛類,像人類。是不能被直接創建為一個物體物件的。因為人類肯定會說話,但人類這個虛類的 說話()函式,在這里被我定義為了一個純虛函式
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/64561.html
標籤:C++ 語言
上一篇:c語言程式設計題目 求幫助謝謝!
