在我看來,在運行時,多態對於某些基類的類型是不同的。 至於超載也是多態性今天第一聽了,如:爲什麼調用函數/方法重載作爲C++中的靜態多態?
void A(int a){}
void A(int a, int b){}
爲什麼A
被稱爲靜態多態性,我只是想知道的概念。
那裏還有一個虛擬表嗎?
在我看來,在運行時,多態對於某些基類的類型是不同的。 至於超載也是多態性今天第一聽了,如:爲什麼調用函數/方法重載作爲C++中的靜態多態?
void A(int a){}
void A(int a, int b){}
爲什麼A
被稱爲靜態多態性,我只是想知道的概念。
那裏還有一個虛擬表嗎?
多態意味着被調用者是決定如何從調用者接收消息時做的事情。
想一條消息「前進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
一起考慮時,它不是一種多態的形式。
非常詳細和這樣的例子,但我有一些奇怪的。爲什麼字符串'+'操作符和'開始(秒錶sw);'不是?雖然'go_forward'有兩個函數,但它在編譯時會和'begin'處理一樣(參見「begin(Iterator
@LoranceChen與基類無關。意義很重要。添加整數和添加浮點數都是加法。但是添加數字和字符串連接並不是一回事。 –
em ...基於什麼「相同的東西」? – LoranceChen
不,它不使用虛擬表,因爲* static *表示它在編譯時被解析。關於[函數重載](https://en.wikipedia.org/wiki/Function_overloading)的維基百科文章將其總結爲:*「當重載一個方法時,您實際上只是製作了一些碰巧具有相同名稱「。* – UnholySheep
我不認爲這是靜態多態性的一個例子。有些函數重載被用作靜態多態,其他一些函數重載不是。 –
@NickyC,你可以展示一個例子或解釋什麼樣的重載是靜態多態嗎? – LoranceChen