當前位置:首頁 » 編程軟體 » 編譯時多態使用什麼方式體現

編譯時多態使用什麼方式體現

發布時間: 2022-06-21 18:29:30

『壹』 多態的定義是什麼代碼的表現形式是

狀態。繼承中的多種狀態等等。。。

C++多態技術
摘要

本文描述了C++中的各種多態性。重點闡述了面向對象的動態多態和基於模板的靜態多態,並初步探討了兩種技術的結合使用。

關鍵詞

多態 繼承 虛函數 模板 宏 函數重載 泛型編程 泛型模式

導言

多態(polymorphism)一詞最初來源於希臘語polumorphos,含義是具有多種形式或形態的情形。在程序設計領域,一個廣泛認可的定義是「一種將不同的特殊行為和單個泛化記號相關聯的能力」。和純粹的面向對象程序設計語言不同,C++中的多態有著更廣泛的含義。除了常見的通過類繼承和虛函數機制生效於運行期的動態多態(dynamic polymorphism)外,模板也允許將不同的特殊行為和單個泛化記號相關聯,由於這種關聯處理於編譯期而非運行期,因此被稱為靜態多態(static polymorphism)。
事實上,帶變數的宏和函數重載機制也允許將不同的特殊行為和單個泛化記號相關聯。然而,習慣上我們並不將它們展現出來的行為稱為多態(或靜態多態)。今天,當我們談及多態時,如果沒有明確所指,默認就是動態多態,而靜態多態則是指基於模板的多態。不過,在這篇以C++各種多態技術為主題的文章中,我們首先還是回顧一下C++社群爭論已久的另一種「多態」:函數多態(function polymorphism),以及更不常提的「宏多態(macro polymorphism)」。

函數多態

也就是我們常說的函數重載(function overloading)。基於不同的參數列表,同一個函數名字可以指向不同的函數定義:

// overload_poly.cpp

#include <iostream>
#include <string>

// 定義兩個重載函數

int my_add(int a, int b)
{
return a + b;
}

int my_add(int a, std::string b)
{
return a + atoi(b.c_str());
}

int main()
{
int i = my_add(1, 2); // 兩個整數相加
int s = my_add(1, "2"); // 一個整數和一個字元串相加
std::cout << "i = " << i << "\n";
std::cout << "s = " << s << "\n";
}

根據參數列表的不同(類型、個數或兼而有之),my_add(1, 2)和my_add(1, "2")被分別編譯為對my_add(int, int)和my_add(int, std::string)的調用。實現原理在於編譯器根據不同的參數列表對同名函數進行名字重整,而後這些同名函數就變成了彼此不同的函數。比方說,也許某個編譯器會將my_add()函數名字分別重整為my_add_int_int()和my_add_int_str()。

宏多態

帶變數的宏可以實現一種初級形式的靜態多態:
// macro_poly.cpp

#include <iostream>
#include <string>

// 定義泛化記號:宏ADD
#define ADD(A, B) (A) + (B);

int main()
{
int i1(1), i2(2);
std::string s1("Hello, "), s2("world!");
int i = ADD(i1, i2); // 兩個整數相加
std::string s = ADD(s1, s2); // 兩個字元串「相加」
std::cout << "i = " << i << "\n";
std::cout << "s = " << s << "\n";
}
當程序被編譯時,表達式ADD(i1, i2)和ADD(s1, s2)分別被替換為兩個整數相加和兩個字元串相加的具體表達式。整數相加體現為求和,而字元串相加則體現為連接。程序的輸出結果符合直覺:
1 + 2 = 3
Hello, + world! = Hello, world!

動態多態

這就是眾所周知的的多態。現代面向對象語言對這個概念的定義是一致的。其技術基礎在於繼承機制和虛函數。例如,我們可以定義一個抽象基類Vehicle和兩個派生於Vehicle的具體類Car和Airplane:

// dynamic_poly.h

#include <iostream>

// 公共抽象基類Vehicle
class Vehicle
{
public:
virtual void run() const = 0;
};

// 派生於Vehicle的具體類Car
class Car: public Vehicle
{
public:
virtual void run() const
{
std::cout << "run a car\n";
}
};

// 派生於Vehicle的具體類Airplane
class Airplane: public Vehicle
{
public:
virtual void run() const
{
std::cout << "run a airplane\n";
}
};
客戶程序可以通過指向基類Vehicle的指針(或引用)來操縱具體對象。通過指向基類對象的指針(或引用)來調用一個虛函數,會導致對被指向的具體對象之相應成員的調用:

// dynamic_poly_1.cpp

#include <iostream>
#include <vector>
#include "dynamic_poly.h"

// 通過指針run任何vehicle
void run_vehicle(const Vehicle* vehicle)
{
vehicle->run(); // 根據vehicle的具體類型調用對應的run()
}

int main()
{
Car car;
Airplane airplane;
run_vehicle(&car); // 調用Car::run()
run_vehicle(&airplane); // 調用Airplane::run()
}

此例中,關鍵的多態介面元素為虛函數run()。由於run_vehicle()的參數為指向基類Vehicle的指針,因而無法在編譯期決定使用哪一個版本的run()。在運行期,為了分派函數調用,虛函數被調用的那個對象的完整動態類型將被訪問。這樣一來,對一個Car對象調用run_vehicle(),實際上將調用Car::run(),而對於Airplane對象而言將調用Airplane::run()。
或許動態多態最吸引人之處在於處理異質對象集合的能力:

// dynamic_poly_2.cpp

#include <iostream>
#include <vector>
#include "dynamic_poly.h"

// run異質vehicles集合
void run_vehicles(const std::vector<Vehicle*>& vehicles)
{
for (unsigned int i = 0; i < vehicles.size(); ++i)
{
vehicles[i]->run(); // 根據具體vehicle的類型調用對應的run()
}
}

int main()
{
Car car;
Airplane airplane;
std::vector<Vehicle*> v; // 異質vehicles集合
v.push_back(&car);
v.push_back(&airplane);
run_vehicles(v); // run不同類型的vehicles
}
在run_vehicles()中,vehicles[i]->run()依據正被迭代的元素的類型而調用不同的成員函數。這從一個側面體現了面向對象編程風格的優雅。

靜態多態

如果說動態多態是通過虛函數來表達共同介面的話,那麼靜態多態則是通過「彼此單獨定義但支持共同操作的具體類」來表達共同性,換句話說,必須存在必需的同名成員函數。
我們可以採用靜態多態機制重寫上一節的例子。這一次,我們不再定義vehicles類層次結構,相反,我們編寫彼此無關的具體類Car和Airplane(它們都有一個run()成員函數):

// static_poly.h

#include <iostream>

//具體類Car
class Car
{
public:
void run() const
{
std::cout << "run a car\n";
}
};

//具體類Airplane
class Airplane
{
public:
void run() const
{
std::cout << "run a airplane\n";
}
};

run_vehicle()應用程序被改寫如下:

// static_poly_1.cpp

#include <iostream>
#include <vector>
#include "static_poly.h"

// 通過引用而run任何vehicle
template <typename Vehicle>
void run_vehicle(const Vehicle& vehicle)
{
vehicle.run(); // 根據vehicle的具體類型調用對應的run()
}

int main()
{
Car car;
Airplane airplane;
run_vehicle(car); // 調用Car::run()
run_vehicle(airplane); // 調用Airplane::run()
}
現在Vehicle用作模板參數而非公共基類對象(事實上,這里的Vehicle只是一個符合直覺的記號而已,此外別無它意)。經過編譯器處理後,我們最終會得到run_vehicle<Car>()和 run_vehicle<Airplane>()兩個不同的函數。這和動態多態不同,動態多態憑借虛函數分派機制在運行期只有一個run_vehicle()函數。
我們無法再透明地處理異質對象集合了,因為所有類型都必須在編譯期予以決定。不過,為不同的vehicles引入不同的集合只是舉手之勞。由於無需再將集合元素局限於指針或引用,我們現在可以從執行性能和類型安全兩方面獲得好處:

// static_poly_2.cpp

#include <iostream>
#include <vector>
#include "static_poly.h"

// run同質vehicles集合
template <typename Vehicle>
void run_vehicles(const std::vector<Vehicle>& vehicles)
{
for (unsigned int i = 0; i < vehicles.size(); ++i)
{
vehicles[i].run(); // 根據vehicle的具體類型調用相應的run()
}
}

int main()
{
Car car1, car2;
Airplane airplane1, airplane2;

std::vector<Car> vc; // 同質cars集合
vc.push_back(car1);
vc.push_back(car2);
//vc.push_back(airplane1); // 錯誤:類型不匹配
run_vehicles(vc); // run cars

std::vector<Airplane> vs; // 同質airplanes集合
vs.push_back(airplane1);
vs.push_back(airplane2);
//vs.push_back(car1); // 錯誤:類型不匹配
run_vehicles(vs); // run airplanes
}

兩種多態機制的結合使用

在一些高級C++應用中,我們可能需要結合使用動態多態和靜態多態兩種機制,以期達到對象操作的優雅、安全和高效。例如,我們既希望一致而優雅地處理vehicles的run問題,又希望「安全而高效」地完成給飛行器(飛機、飛艇等)進行「空中加油」這樣的高難度動作。為此,我們首先將上面的vehicles類層次結構改寫如下:

// dscombine_poly.h

#include <iostream>
#include <vector>

// 公共抽象基類Vehicle
class Vehicle
{
public:
virtual void run() const = 0;
};

// 派生於Vehicle的具體類Car
class Car: public Vehicle
{
public:
virtual void run() const
{
std::cout << "run a car\n";
}
};

// 派生於Vehicle的具體類Airplane
class Airplane: public Vehicle
{
public:
virtual void run() const
{
std::cout << "run a airplane\n";
}

void add_oil() const
{
std::cout << "add oil to airplane\n";
}
};

// 派生於Vehicle的具體類Airship
class Airship: public Vehicle
{
public:
virtual void run() const
{
std::cout << "run a airship\n";
}

void add_oil() const
{
std::cout << "add oil to airship\n";
}
};

我們理想中的應用程序可以編寫如下:

// dscombine_poly.cpp

#include <iostream>
#include <vector>
#include "dscombine_poly.h"

// run異質vehicles集合
void run_vehicles(const std::vector<Vehicle*>& vehicles)
{
for (unsigned int i = 0; i < vehicles.size(); ++i)
{
vehicles[i]->run(); // 根據具體的vehicle類型調用對應的run()
}
}

// 為某種特定的aircrafts同質對象集合進行「空中加油」
template <typename Aircraft>
void add_oil_to_aircrafts_in_the_sky(const std::vector<Aircraft>& aircrafts)
{
for (unsigned int i = 0; i < aircrafts.size(); ++i)
{
aircrafts[i].add_oil();
}
}

int main()
{
Car car1, car2;
Airplane airplane1, airplane2;

Airship airship1, airship2;
std::vector<Vehicle*> v; // 異質vehicles集合
v.push_back(&car1);
v.push_back(&airplane1);
v.push_back(&airship1);
run_vehicles(v); // run不同種類的vehicles

std::vector<Airplane> vp; // 同質airplanes集合
vp.push_back(airplane1);
vp.push_back(airplane2);
add_oil_to_aircrafts_in_the_sky(vp); // 為airplanes進行「空中加油」

std::vector<Airship> vs; // 同質airships集合
vs.push_back(airship1);
vs.push_back(airship2);
add_oil_to_aircrafts_in_the_sky(vs); // 為airships進行「空中加油」
}

我們保留了類層次結構,目的是為了能夠利用run_vehicles()一致而優雅地處理異質對象集合vehicles的run問題。同時,利用函數模板add_oil_to_aircrafts_in_the_sky<Aircraft>(),我們仍然可以處理特定種類的vehicles — aircrafts(包括airplanes和airships)的「空中加油」問題。其中,我們避開使用指針,從而在執行性能和類型安全兩方面達到了預期目標。

結語

長期以來,C++社群對於多態的內涵和外延一直爭論不休。在comp.object這樣的網路論壇上,此類話題爭論至今仍隨處可見。曾經有人將動態多態(dynamic polymorphism)稱為inclusion polymorphism,而將靜態多態(static polymorphism)稱為parametric polymorphism或parameterized polymorphism。

我注意到2003年斯坦福大學公開的一份C++ and Object-Oriented Programming教案中明確提到了函數多態概念:Function overloading is also referred to as function polymorphism as it involves one function having many forms。文後的「參考文獻」單元給出了這個網頁鏈接。

可能你是第一次看到宏多態(macro polymorphism)這個術語。不必訝異 — 也許我就是造出這個術語的「第一人」。顯然,帶變數的宏(或類似於函數的宏或偽函數宏)的替換機制除了免除小型函數的調用開銷之外,也表現出了類似的多態性。在我們上面的例子中,字元串相加所表現出來的符合直覺的連接操作,事實上是由底部運算符重載機制(operator overloading)支持的。值得指出的是,C++社群中有人將運算符重載所表現出來的多態稱為ad hoc polymorphism。

David Vandevoorde和Nicolai M. Josuttis在他們的著作C++ Templates: The Complete Guide一書中系統地闡述了靜態多態和動態多態技術。因為認為「和其他語言機制關系不大」,這本書沒有提及「宏多態」(以及「函數多態」)。(需要說明的是,筆者本人是這本書的繁體中文版譯者之一,本文正是基於這本書的第14章The Polymorphic Power of Templates編寫而成)

動態多態只需要一個多態函數,生成的可執行代碼尺寸較小,靜態多態必須針對不同的類型產生不同的模板實體,尺寸會大一些,但生成的代碼會更快,因為無需通過指針進行間接操作。靜態多態比動態多態更加類型安全,因為全部綁定都被檢查於編譯期。正如前面例子所示,你不可將一個錯誤的類型的對象插入到從一個模板實例化而來的容器之中。此外,正如你已經看到的那樣,動態多態可以優雅地處理異質對象集合,而靜態多態可以用來實現安全、高效的同質對象集合操作。

靜態多態為C++帶來了泛型編程(generic programming)的概念。泛型編程可以認為是「組件功能基於框架整體而設計」的模板編程。STL就是泛型編程的一個典範。STL是一個框架,它提供了大量的演算法、容器和迭代器,全部以模板技術實現。從理論上講,STL的功能當然可以使用動態多態來實現,不過這樣一來其性能必將大打折扣。

靜態多態還為C++社群帶來了泛型模式(generic patterns)的概念。理論上,每一個需要通過虛函數和類繼承而支持的設計模式都可以利用基於模板的靜態多態技術(甚至可以結合使用動態多態和靜態多態兩種技術)而實現。正如你看到的那樣,Andrei Alexandrescu的天才作品Modern C++ Design: Generic Programming and Design Patterns Applied(Addison-Wesley)和Loki程序庫已經走在了我們的前面。

『貳』 多態的形式

多態指同一個實體同時具有多種形式。它是面向對象程序設計(OOP)的一個重要特徵。如果一個語言只支持類而不支持多態,只能說明它是基於對象的,而不是面向對象的。C++中的多態性具體體現在運行和編譯兩個方面。運行時多態是動態多態,其具體引用的對象在運行時才能確定。編譯時多態是靜態多態,在編譯時就可以確定對象使用的形式。
多態:同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果。在運行時,可以通過指向基類的指針,來調用實現派生類中的方法。
C++中,實現多態有以下方法:虛函數,抽象類,覆蓋,模板(重載和多態無關)。
OC中的多態:不同對象對同一消息的不同響應.子類可以重寫父類的方法
多態就是允許方法重名 參數或返回值可以是父類型傳入或返回。
多態也指生物學中腔腸動物的特殊的生活方式。水螅態與水母態的世代交替現象。

『叄』 java實現多態有幾種方式分別是什麼

首先,多態存在的三個必要條件
一、要有繼承;
二、要有重寫;
三、父類引用指向子類對象。
多態引用類型有兩種方式:
a. 編譯時多態:方法的重載;
b. 運行時多態:JAVA運行時系統根據調用該方法的實例的類型來決定選擇調用哪個方法則被稱為運行時多態。(我們平時說得多的事運行時多態,所以多態主要也是指運行時多態);

『肆』 簡述java類中多態性的體現形式

多態可分為:
1.編譯多態:主要是體現在重載,系統在編譯時就能確定調用重載函數的哪個版本。
2.運行多態:主要體現在OO設計的繼承性上,子類的對象也是父類的對象,即上溯造型,所以子類對象可以作為父類對象使用,父類的對象變數可以指向子類對象。因此通過一個父類發出的方法調用可能執行的是方法在父類中的實現,也可能是某個子類中的實現,它是由運行時刻具體的對象類型決定的。

『伍』 1. 編譯時的多態性與運行時的多態性有什麼區別,他們的實現方法有什麼不同

多態從實現的角度可以劃為兩類:編譯時多態和運行時多態。

編譯時的多態性:就是在程序編譯的時候,也就是生成解決方案的時候就決定要實現什麼操作。

運行時的多態性:就是指直到系統運行時,才根據實際情況決定實現何種操作。

1、多態實現形式不同:

編譯時的多態是通過靜態連編來實現的;運行時的多態是用動態連編來實現的。

2、多態性通過方式不同:

編譯時的多態性主要是通過函數重載和運算符重載來實現的;運行時的多態性主要是通過虛函數來實現的。

(5)編譯時多態使用什麼方式體現擴展閱讀:

靜態多態性又稱編譯時的多態性。靜態多態性的函數調用速度快、效率高但缺乏靈活性,在程序運行前就應決定執行的函數和方法。

動態多態性的特點是:不在編譯時確定調用的是哪個函數,而是在程序運行過程中才動態地確定操作所針對的對象。又稱運行時的多態性。動態多態性是通過虛函數(virtual function)實現的。

『陸』 C++中多態是怎樣實現的

多態是一種不同的對象以單獨的方式作用於相同消息的能力,這個概念是從自然語言中引進的。例如,動詞「關閉」應用到不同的事務上其意思是不同的。關門,關閉銀行賬號或關閉一個程序的窗口都是不同的行為;其實際的意義取決於該動作所作用的對象。 大多數面向對象語言的多態特性都僅以虛擬函數的形式來實現,但C++除了一般的虛擬函數形式之外,還多了兩種靜態的(即編譯時的)多態機制: 2、模板:例如,當接受到相同的消息時,整型vector對象和串vector對象對消息反映是不同的,我們以關閉行為為例: vector < int > vi; vector < string > names; string name("VC知識庫"); vi.push_back( 5 ); // 在 vector 尾部添加整型 names.push_back (name); // 添加串和添加整型體現差別的潛在的操作 靜態的多態機制不會導致與虛擬函數相關的運行時開。此外,操作符重載和模板兩者是通用演算法最基本的東西,在STL中體現得尤為突出。 那麼接下來我們說說以虛函數形式多態: 通常都有以重載、覆蓋、隱藏來三中方式,三種方式的區別大家應該要很深入的了解,這里就不多說了。 許多開發人員往往將這種情況和C++的多態性搞混淆,下面我從兩方面為大家解說: 1、 編譯的角度 C++編譯器在編譯的時候,要確定每個對象調用的函數的地址,這稱為早期綁定(early binding)。2、 內存模型的角度為了確定對象調用的函數的地址,就要使用遲綁定(late binding)技術。當編譯器使用遲綁定時,就會在運行時再去確定對象的類型以及正確的調用函數。而要讓編譯器採用遲綁定,就要在基類中聲明函數時使用virtual關鍵字(注意,這是必須的,很多開發人員就是因為沒有使用虛函數而寫出很多錯誤的例子),這樣的函數我們稱為虛函數。一旦某個函數在基類中聲明為virtual,那麼在所有的派生類中該函數都是virtual,而不需要再顯式地聲明為virtual。 那麼如何定位虛表呢?編譯器另外還為每個類的對象提供了一個虛表指針(即vptr),這個指針指向了對象所屬類的虛表。在程序運行時,根據對象的類型去初始化vptr,從而讓vptr正確的指向所屬類的虛表,從而在調用虛函數時,就能夠找到正確的函數。 正是由於每個對象調用的虛函數都是通過虛表指針來索引的,也就決定了虛表指針的正確初始化是非常重要的。換句話說,在虛表指針沒有正確初始化之前,我們不能夠去調用虛函數。那麼虛表指針在什麼時候,或者說在什麼地方初始化呢? 答案是在構造函數中進行虛表的創建和虛表指針的初始化。還記得構造函數的調用順序嗎,在構造子類對象時,要先調用父類的構造函數,此時編譯器只「看到了」父類,並不知道後面是否後還有繼承者,它初始化父類對象的虛表指針,該虛表指針指向父類的虛表。當執行子類的構造函數時,子類對象的虛表指針被初始化,指向自身的虛表。 要注意:對於虛函數調用來說,每一個對象內部都有一個虛表指針,該虛表指針被初始化為本類的虛表。所以在程序中,不管你的對象類型如何轉換,但該對象內部的虛表指針是固定的,所以呢,才能實現動態的對象函數調用,這就是C++多態性實現的原理。總結(基類有虛函數):1、 每一個類都有虛表。2、虛表可以繼承,如果子類沒有重寫虛函數,那麼子類虛表中仍然會有該函數的地址,只不過這個地址指向的是基類的虛函數實現。如果基類3個虛函數,那麼基類的虛表中就有三項(虛函數地址),派生類也會有虛表,至少有三項,如果重寫了相應的虛函數,那麼虛表中的地址就會改變,指向自身的虛函數實現。如果派生類有自己的虛函數,那麼虛表中就會添加該項。3、派生類的虛表中虛函數地址的排列順序和基類的虛表中虛函數地址排列順序相同。

『柒』 什麼是多態

多態首先是建立在繼承的基礎上的,先有繼承才能有多態。多態是指不同的子類在繼承父類後分別都重寫覆蓋了父類的方法,即父類同一個方法,在繼承的子類中表現出不同的形式。多態成立的另一個條件是在創建子類時候必須使用父類new子類的方式。

多態(Polymorphism)按字面的意思就是「多種狀態」。在面向對象語言中,介面的多種不同的實現方式即為多態。引用Charlie Calverts對多態的描述——多態性是允許你將父對象設置成為一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作(摘自「Delphi4編程技術內幕」)。

簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。多態性在Object Pascal和C++中都是通過虛函數實現的。

拓展資料:

多態指同一個實體同時具有多種形式。它是面向對象程序設計(OOP)的一個重要特徵。如果一個語言只支持類而不支持多態,只能說明它是基於對象的,而不是面向對象的。C++中的多態性具體體現在運行和編譯兩個方面。運行時多態是動態多態,其具體引用的對象在運行時才能確定。編譯時多態是靜態多態,在編譯時就可以確定對象使用的形式。

多態:同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果。在運行時,可以通過指向基類的指針,來調用實現派生類中的方法。

C++中,實現多態有以下方法:虛函數,抽象類,覆蓋,模板(重載和多態無關)。

OC中的多態:不同對象對同一消息的不同響應.子類可以重寫父類的方法。

多態就是允許方法重名 參數或返回值可以是父類型傳入或返回。

多態也指生物學中腔腸動物的特殊的生活方式。水螅態與水母態的世代交替現象。

把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。

賦值之後,父類型的引用就可以根據當前賦值給它的子對象的特性以不同的方式運作。也就是說,父親的行為像兒子,而不是兒子的行為像父親。

使用繼承性的結果就是當創建了一個類的家族,在認識這個類的家族時,就是把子類的對象當作基類的對象,這種認識又叫作upcasting(向上轉型)。這樣認識的重要性在於:我們可以只針對基類寫出一段程序,但它可以適應於這個類的家族,因為編譯器會自動找出合適的對象來執行操作。這種現象又稱為多態性。而實現多態性的手段又叫稱動態綁定(dynamic binding)。

簡單的說,建立一個父類對象的引用,它所指對象可以是這個父類的對象,也可以是它的子類的對象。java中當子類擁有和父類同樣的函數,當通過這個父類對象的引用調用這個函數的時候,調用到的是子類中的函數。

『捌』 編譯時多態性使用什麼獲得!A重載函數B繼承C虛函數D.B和C

函數重載和模板。就這題來說選A。
繼承和虛函數對應的多態需要在運行的時候才能確定具體對象,所以不屬於編譯時多態。

函數重載是讓一個函數名對應多個函數,編譯器會根據調用時候的特徵確定要調用的函數,不需要再運行時處理。
而模板是讓一個一個類型模板或者函數模板對應多個類型或者函數,編譯器根據對模板實例化是使用的參數生成具體的類和函數,也不是在運行時進行的。
另外注意模板變數不屬於多態范疇。

『玖』 c++多態的實現方式有哪些

c++是一種編程語言,當然只有一種。但是基於c++的編程平台有很多種。

在這些平台上編程序,用的語言是c++的,但是在一些細節上會有所不同。我接觸過的主要有vc++,symbian c++,borland c++,它們都是基於c++的,但是編程風格或方式稍有不同。

你學c++要打好基礎,先學好c++語言。看書的時候可以找一些書名為「c++編程語言」之類的書,只有在學好c++語言後,才可以去具體的學習某個平台的編程教程。

一般來說,多態分為兩種,靜態多態和動態多態。靜態多態也稱編譯時多態,主要包括模板和重載。而動態多態則是通過類的繼承和虛函數來實現,當基類和子類擁有同名同參同返回的方法,且該方法聲明為虛方法。

當基類對象,指針,引用指向的是派生類的對象的時候,基類對象,指針,引用在調用基類的虛函數,實際上調用的是派生類函數。這就是動態多態。

靜態多態的實現。

靜態多態靠編譯器來實現,簡單來說就是編譯器對原來的函數名進行修飾,在c語言中,函數無法重載,是因為,c編譯器在修飾函數時,只是簡單的在函數名前加上下劃線」_」 ,不過從gcc編譯器編譯之後發現函數名並不會發生變化。

而c++編譯器不同,它根據函數參數的類型,個數來對函數名進行修飾,這就使得函數可以重載,同理,模板也是可以實現的,針對不同類型的實參來產生對應的特化的函數,通過增加修飾,使得不同的類型參數的函數得以區分。

熱點內容
不用internet打開ftp 發布:2025-05-15 23:06:00 瀏覽:153
sql字元串取數字 發布:2025-05-15 22:57:45 瀏覽:124
推薦編程課 發布:2025-05-15 22:34:12 瀏覽:618
表拒絕訪問 發布:2025-05-15 22:29:37 瀏覽:978
電腦怎樣解壓文件 發布:2025-05-15 22:25:32 瀏覽:439
dns伺服器怎麼看 發布:2025-05-15 22:17:27 瀏覽:151
3dm的壓縮包 發布:2025-05-15 22:09:23 瀏覽:662
和存儲字長 發布:2025-05-15 21:54:09 瀏覽:515
用什麼寫c語言 發布:2025-05-15 21:35:56 瀏覽:418
linux讀取u盤 發布:2025-05-15 21:32:13 瀏覽:508