2017-01-08 48 views
0

在我看來,在運行時,多態對於某些基類的類型是不同的。 至於超載也是多態性今天第一聽了,如:爲什麼調用函數/方法重載作爲C++中的靜態多態?

void A(int a){} 
void A(int a, int b){} 

爲什麼A被稱爲靜態多態性,我只是想知道的概念。
那裏還有一個虛擬表嗎?

+4

不,它不使用虛擬表,因爲* static *表示它在編譯時被解析。關於[函數重載](https://en.wikipedia.org/wiki/Function_overloading)的維基百科文章將其總結爲:*「當重載一個方法時,您實際上只是製作了一些碰巧具有相同名稱「。* – UnholySheep

+0

我不認爲這是靜態多態性的一個例子。有些函數重載被用作靜態多態,其他一些函數重載不是。 –

+0

@NickyC,你可以展示一個例子或解釋什麼樣的重載是靜態多態嗎? – LoranceChen

回答

1

多態意味着被調用者是決定如何從調用者接收消息時做的事情。

想一條消息「前進10米」。如果被叫方是一個人,那麼該人通過步行來這樣做。如果被叫者是一輛汽車,汽車通過轉動車輪來完成。

多態的想法並未指定涉及哪些語言功能,或者何時做出如何做決定。我們可以在運行時使用虛擬功能。我們可以在編譯時(靜態多態),使用函數重載,模板,甚至是邪惡的預處理宏。

如果我們使用虛擬函數:

MovableObject* ptr = get_person(); 
ptr->go_forward(10); 

MovableObject* ptr2 = get_car(); 
ptr2->go_forward(10); 

如果我們使用函數重載:

void go_forward(Person& person, int distance); 
void go_forward(Car& car, int distance); 

並非所有的函數重載用作多態性。

要通過重載演示靜態多態性,請考慮兩個簡單的程序。

// Program 1 
int a; 
int b; 
std::cin >> a >> b; 
int sum = a + b; 
std::cout << sum; 

// Program 2 
double a; 
double b; 
std::cin >> a >> b; 
double sum = a + b; 
std::cout << sum; 

等等。看起來它不涉及重載,是嗎?

實際上,有超載。這兩個程序都涉及表達式a + b。他們都是對我們的補充。但是有一個區別:程序1中的+被編譯成機器指令整數加法;程序2中的+被編譯成浮點數加。兩者都是補充,但實際操作是非常不同的。

它是否超載?是的,+已超載。

它是多態嗎?是的,+對於這兩種情況的調用者意味着相同的事情,並且底層操作是不同的。

現在考慮另一種使用+

// Program 3 
std::string a; 
std::string b; 
std::cin >> a >> b; 
std::string sum = a + b; 
std::cout << sum; 

程序3也使用+。但它不再添加。現在是字符串連接。

它是否超載?是的,+已超載。

它是多態嗎?不,現在的含義與程序1和2不同。加法和連接是非常不同的事情。


另一個例子。

想象一下標準庫容器。

vector<int> my_vector; 
begin(my_vector); 

list<double> my_list; 
begin(my_list); 

它是否超載?是的,begin已超載。

它是多態嗎?是的,begin的兩個版本都返回指向第一個元素的迭代器,即使迭代器的類型不同。

這個怎麼樣。代表秒錶的課程以及函數begin開始計時。

Stopwatch my_watch; 
begin(my_watch); 

是否超載?是的,begin已超載。

它是多態嗎?這次不行。這begin是不是獲得一個迭代器。它只是啓動秒錶。意思是不同的,所以當它與其他的begin一起考慮時,它不是一種多態的形式。

+0

非常詳細和這樣的例子,但我有一些奇怪的。爲什麼字符串'+'操作符和'開始(秒錶sw);'不是?雖然'go_forward'有兩個函數,但它在編譯時會和'begin'處理一樣(參見「begin(Iterator param)」,不同的參數應該有相同的基類,所謂的多態性?)。但'+ +真是太神奇了...... – LoranceChen

+0

@LoranceChen與基類無關。意義很重要。添加整數和添加浮點數都是加法。但是添加數字和字符串連接並不是一回事。 –

+0

em ...基於什麼「相同的東西」? – LoranceChen

相關問題