精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++基礎之C++多態技術

開發 后端
本文介紹的是C++中三大機制之一的多態技術,主要從三個方面給大家介紹的。希望對大家有幫助,一起來看。

多態(polymorphism)一詞最初來源于希臘語polumorphos,含義是具有多種形式或形態的情形。在程序設計領域,一個廣泛認可的定義是“一種將不同的特殊行為和單個泛化記號相關聯的能力”。和純粹的面向對象程序設計語言不同,C++中的多態有著更廣泛的含義。除了常見的通過類繼承和虛函數機制生效于運行期的動態多態(dynamic polymorphism)外,模板也允許將不同的特殊行為和單個泛化記號相關聯,由于這種關聯處理于編譯期而非運行期,因此被稱為靜態多態(static polymorphism)。

事實上,帶變量的宏和函數重載機制也允許將不同的特殊行為和單個泛化記號相關聯。然而,習慣上我們并不將它們展現出來的行為稱為多態(或靜態多態)。今天,當我們談及多態時,如果沒有明確所指,默認就是動態多態,而靜態多態則是指基于模板的多態。不過,在這篇以C++各種多態技術為主題的文章中,我們首先還是回顧一下C++社群爭論已久的另一種“多態”:函數多態(function polymorphism),以及更不常提的“宏多態(macro polymorphism)”。

函數多態

也就是我們常說的函數重載(function overloading)?;诓煌膮盗斜?,同一個函數名字可以指向不同的函數定義:// overload_poly.cpp

  1. #include <iostream>  
  2. #include <string>  
  3. // 定義兩個重載函數  
  4. int my_add(int a, int b)  
  5. {  
  6. return a + b;  
  7. }  
  8. int my_add(int a, std::string b)  
  9. {  
  10. return a + atoi(b.c_str());  
  11. }  
  12. int main()  
  13. {  
  14. int i = my_add(1, 2); // 兩個整數相加  
  15. int s = my_add(1, "2"); // 一個整數和一個字符串相加  
  16. std::cout << "i = " << i << "\n";  
  17. std::cout << "s = " << s << "\n";  
  18. }  

根據參數列表的不同(類型、個數或兼而有之),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()。

宏多態

帶變量的宏可以實現一種初級形式的靜態多態:

  1. #include <iostream>  
  2. #include <string>  
  3.  
  4. // 定義泛化記號:宏ADD  
  5. #define ADD(A, B) (A) + (B);  
  6.  
  7. int main()  
  8. {  
  9.     int i1(1), i2(2);  
  10.     std::string s1("Hello, "), s2("world!");  
  11.     int i = ADD(i1, i2);                        // 兩個整數相加  
  12.     std::string s = ADD(s1, s2);                // 兩個字符串“相加”  
  13.     std::cout << "i = " << i << "\n";  
  14.     std::cout << "s = " << s << "\n";  


當程序被編譯時,表達式ADD(i1, i2)和ADD(s1, s2)分別被替換為兩個整數相加和兩個字符串相加的具體表達式。整數相加體現為求和,而字符串相加則體現為連接。

程序的輸出結果符合直覺:

  1. 1 + 2 = 3 
  2. Hello, + world! = Hello, world!  

動態多態

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

  1. // dynamic_poly.h  
  2. #include <iostream>  
  3. // 公共抽象基類Vehicle  
  4. class Vehicle  
  5. {  
  6. public:  
  7.     virtual void run() const = 0;  
  8. };  
  9. // 派生于Vehicle的具體類Car  
  10. class Car: public Vehicle  
  11. {  
  12. public:  
  13.     virtual void run() const 
  14.     {  
  15.         std::cout << "run a car\n";  
  16.     }  
  17. };  
  18. // 派生于Vehicle的具體類Airplane  
  19. class Airplane: public Vehicle  
  20. {  
  21. public:  
  22.     virtual void run() const 
  23.     {  
  24.         std::cout << "run a airplane\n";  
  25.     }  
  26. };  

客戶程序可以通過指向基類Vehicle的指針(或引用)來操縱具體對象。通過指向基類對象的指針(或引用)來調用一個虛函數,會導致對被指向的具體對象之相應成員的調用:

  1. // dynamic_poly_1.cpp  
  2. #include <iostream>  
  3. #include <vector>  
  4. #include "dynamic_poly.h"  
  5. // 通過指針run任何vehicle  
  6. void run_vehicle(const Vehicle* vehicle)  
  7. {  
  8.     vehicle->run();            // 根據vehicle的具體類型調用對應的run()  
  9. }  
  10.  
  11. int main()  
  12. {  
  13.     Car car;  
  14.     Airplane airplane;  
  15.     run_vehicle(&car);         // 調用Car::run()  
  16.     run_vehicle(&airplane);    // 調用Airplane::run()  

此例中,關鍵的多態接口元素為虛函數run()。由于run_vehicle()的參數為指向基類Vehicle的指針,因而無法在編譯期決定使用哪一個版本的run()。在運行期,為了分派函數調用,虛函數被調用的那個對象的完整動態類型將被訪問。這樣一來,對一個Car對象調用run_vehicle(),實際上將調用Car::run(),而對于Airplane對象而言將調用Airplane::run()。

或許動態多態最吸引人之處在于處理異質對象集合的能力:

  1. // dynamic_poly_2.cpp  
  2. #include <iostream>  
  3. #include <vector>  
  4. #include "dynamic_poly.h"  
  5. // run異質vehicles集合  
  6. void run_vehicles(const std::vector<Vehicle*>& vehicles)  
  7. {  
  8.     for (unsigned int i = 0; i < vehicles.size(); ++i)  
  9.     {  
  10.         vehicles[i]->run();     // 根據具體vehicle的類型調用對應的run()  
  11.     }  
  12. }  
  13. int main()  
  14. {  
  15.     Car car;  
  16.     Airplane airplane;  
  17.     std::vector<Vehicle*> v;    // 異質vehicles集合  
  18.     v.push_back(&car);  
  19.     v.push_back(&airplane);  
  20.     run_vehicles(v);            // run不同類型的vehicles  

在run_vehicles()中,

  1. vehicles[i]->run() 

依據正被迭代的元素的類型而調用不同的成員函數。這從一個側面體現了面向對象編程風格的優雅。

靜態多態

如果說動態多態是通過虛函數來表達共同接口的話,那么靜態多態則是通過“彼此單獨定義但支持共同操作的具體類”來表達共同性,換句話說,必須存在必需的同名成員函數。

我們可以采用靜態多態機制重寫上一節的例子。這一次,我們不再定義vehicles類層次結構,相反,我們編寫彼此無關的具體類Car和Airplane(它們都有一個run()成員函數):

  1. // static_poly.h  
  2. #include <iostream>  
  3. //具體類Car  
  4. class Car  
  5. {  
  6. public:  
  7.     void run() const 
  8.     {  
  9.         std::cout << "run a car\n";  
  10.     }  
  11. };  
  12. //具體類Airplane  
  13. class Airplane  
  14. {  
  15. public:  
  16.     void run() const 
  17.     {  
  18.         std::cout << "run a airplane\n";  
  19.     }  
  20. }; 

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

  1. // static_poly_1.cpp  
  2. #include <iostream>  
  3. #include <vector>  
  4. #include "static_poly.h"  
  5. // 通過引用而run任何vehicle  
  6. template <typename Vehicle>  
  7. void run_vehicle(const Vehicle& vehicle)  
  8. {  
  9.     vehicle.run();            // 根據vehicle的具體類型調用對應的run()  
  10. }  
  11.  
  12. int main()  
  13. {  
  14.     Car car;  
  15.     Airplane airplane;  
  16.     run_vehicle(car);         // 調用Car::run()  
  17.     run_vehicle(airplane);    // 調用Airplane::run()  
  18. }  

現在Vehicle用作模板參數而非公共基類對象(事實上,這里的Vehicle只是一個符合直覺的記號而已,此外別無它意)。經過編譯器處理后,我們最終會得到run_vehicle<Car>()和 run_vehicle<Airplane>()兩個不同的函數。這和動態多態不同,動態多態憑借虛函數分派機制在運行期只有一個run_vehicle()函數。

我們無法再透明地處理異質對象集合了,因為所有類型都必須在編譯期予以決定。不過,為不同的vehicles引入不同的集合只是舉手之勞。由于無需再將集合元素局限于指針或引用,我們現在可以從執行性能和類型安全兩方面獲得好處:

  1. // static_poly_2.cpp  
  2.  
  3. #include <iostream> 
  4. #include <vector> 
  5. #include "static_poly.h"  
  6.  
  7. // run同質vehicles集合  
  8. template <typename Vehicle> 
  9. void run_vehicles(const std::vector<Vehicle>& vehicles)  
  10. {  
  11.     for (unsigned int i = 0; i < vehicles.size(); ++i)   
  12.     {  
  13.         vehicles[i].run();            // 根據vehicle的具體類型調用相應的run()  
  14.     }  
  15. }  
  16.  
  17. int main()  
  18. {  
  19.     Car car1, car2;  
  20.     Airplane airplane1, airplane2;  
  21.  
  22.     std::vector<Car> vc;              // 同質cars集合  
  23.     vc.push_back(car1);  
  24.     vc.push_back(car2);  
  25.     //vc.push_back(airplane1);        // 錯誤:類型不匹配  
  26.     run_vehicles(vc);                 // run cars  
  27.  
  28.     std::vector<Airplane> vs;         // 同質airplanes集合  
  29.     vs.push_back(airplane1);  
  30.     vs.push_back(airplane2);  
  31.     //vs.push_back(car1);             // 錯誤:類型不匹配  
  32.     run_vehicles(vs);                 // run airplanes  

#p#

兩種多態機制的結合使用

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

  1. // dscombine_poly.h  
  2.  
  3. #include <iostream>  
  4. #include <vector>  
  5.  
  6. // 公共抽象基類Vehicle  
  7. class Vehicle  
  8. {  
  9.     public:  
  10.     virtual void run() const = 0;  
  11. };  
  12.  
  13. // 派生于Vehicle的具體類Car  
  14. class Car: public Vehicle  
  15. {  
  16. public:  
  17.     virtual void run() const 
  18.     {  
  19.         std::cout << "run a car\n";  
  20.     }  
  21. };  
  22.  
  23. // 派生于Vehicle的具體類Airplane  
  24. class Airplane: public Vehicle  
  25. {  
  26. public:  
  27.     virtual void run() const 
  28.     {  
  29.         std::cout << "run a airplane\n";  
  30.     }  
  31.  
  32.     void add_oil() const 
  33.     {  
  34.         std::cout << "add oil to airplane\n";  
  35.     }  
  36. };  
  37.  
  38. // 派生于Vehicle的具體類Airship  
  39. class Airship: public Vehicle  
  40. {  
  41. public:  
  42.     virtual void run() const 
  43.     {  
  44.         std::cout << "run a airship\n";  
  45.     }  
  46.     
  47.     void add_oil() const 
  48.     {  
  49.         std::cout << "add oil to airship\n";  
  50.     }  
  51. }; 

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

  1. // dscombine_poly.cpp  
  2.  
  3. #include <iostream>  
  4. #include <vector>  
  5. #include "dscombine_poly.h"  
  6.  
  7. // run異質vehicles集合  
  8. void run_vehicles(const std::vector<Vehicle*>& vehicles)  
  9. {  
  10.     for (unsigned int i = 0; i < vehicles.size(); ++i)  
  11.     {  
  12.         vehicles[i]->run();                 // 根據具體的vehicle類型調用對應的run()  
  13.     }  
  14. }  
  15.  
  16. // 為某種特定的aircrafts同質對象集合進行“空中加油”  
  17. template <typename Aircraft>  
  18. void add_oil_to_aircrafts_in_the_sky(const std::vector<Aircraft>& aircrafts)  
  19. {  
  20.     for (unsigned int i = 0; i < aircrafts.size(); ++i)  
  21.     {  
  22.         aircrafts[i].add_oil();  
  23.     }  
  24. }  
  25.  
  26. int main()  
  27. {  
  28.     Car car1, car2;  
  29.     Airplane airplane1, airplane2;  
  30.  
  31.     Airship airship1, airship2;  
  32.     std::vector<Vehicle*> v;                // 異質vehicles集合  
  33.     v.push_back(&car1);  
  34.     v.push_back(&airplane1);  
  35.     v.push_back(&airship1);  
  36.     run_vehicles(v);                        // run不同種類的vehicles  
  37.  
  38.     std::vector<Airplane> vp;               // 同質airplanes集合  
  39.     vp.push_back(airplane1);  
  40.     vp.push_back(airplane2);  
  41.     add_oil_to_aircrafts_in_the_sky(vp);    // 為airplanes進行“空中加油”  
  42.  
  43.     std::vector<Airship> vs;                // 同質airships集合  
  44.     vs.push_back(airship1);  
  45.     vs.push_back(airship2);  
  46.     add_oil_to_aircrafts_in_the_sky(vs);    // 為airships進行“空中加油”  
  47. }  

我們保留了類層次結構,目的是為了能夠利用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程序庫已經走在了我們的前面。

責任編輯:于鐵 來源: 互聯網
相關推薦

2011-07-14 17:45:06

CC++

2011-07-13 18:24:18

C++

2020-07-30 12:40:35

CC++編程語言

2011-04-12 10:40:04

C++多態

2010-02-03 10:50:33

C++多態

2011-07-15 01:38:56

C++this指針

2011-07-10 15:26:54

C++

2011-04-06 08:57:07

C++java多態

2011-07-14 23:27:05

C++引用

2011-07-13 16:14:53

C++引用指針

2024-02-26 18:23:29

C++封裝代碼

2023-11-22 12:25:05

C++RTTI

2010-02-05 16:07:52

C++多態覆蓋

2010-11-22 16:01:08

C++多態

2011-06-21 10:00:21

預處理指令

2011-07-14 17:02:09

C++指針

2011-07-14 17:17:21

C++指針

2011-07-15 01:34:36

C++重載運算符

2011-07-15 01:29:39

C++析構函數

2010-02-06 09:53:26

C++ void
點贊
收藏

51CTO技術棧公眾號

精品人伦一区二区三区蜜桃网站 | 精品人妻一区二区三区蜜桃| 女人天堂亚洲aⅴ在线观看| 亚洲成人网在线| 日日噜噜夜夜狠狠| av3级在线| 国产精品午夜电影| 国产精品一区二区a| 中文区中文字幕免费看| 亚洲激精日韩激精欧美精品| 综合久久五月天| 亚洲国产精品无码久久久久高潮| 成人在线观看免费播放| 黑人欧美xxxx| 国产成人亚洲综合无码| 91大神xh98hx在线播放| 99国产精品久久久久久久久久| 国产情人节一区| 国产原创视频在线| 亚洲国产综合在线看不卡| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | av女优在线| 97国产精品videossex| 亚洲一区二区少妇| 中文字幕欧美人妻精品| 亚洲一区黄色| 久久久噜噜噜久久| 全网免费在线播放视频入口| 日韩精品永久网址| 国产亚洲美女久久| 男女黄床上色视频| 噜噜噜天天躁狠狠躁夜夜精品| 678五月天丁香亚洲综合网| caoporn超碰97| 韩国美女久久| 欧美日韩性视频在线| 久久亚洲精品无码va白人极品| 国产精品扒开做爽爽爽的视频| 欧美国产禁国产网站cc| 欧美亚洲另类久久综合| 肉丝一区二区| 337p粉嫩大胆色噜噜噜噜亚洲| 国产精品亚洲综合| 日日夜夜精品免费| bt7086福利一区国产| 国产精品久久久久久久久久久久午夜片| 一级特黄aaa| 麻豆91在线观看| 国产剧情日韩欧美| 一级片免费网站| 国产一区二区三区综合| 亚洲www视频| av网站在线免费看| 成人永久免费视频| 国产精品美女诱惑| 熟妇高潮一区二区三区| 91在线观看下载| 欧美日韩国产精品一卡| 久久精品国产亚洲a∨麻豆| 久久午夜老司机| 日本免费高清不卡| 97超碰人人在线| 亚洲色图清纯唯美| 性高湖久久久久久久久aaaaa| 激情图片在线观看高清国产| 天天综合色天天综合色h| 日本精品免费在线观看| 国产经典一区| 欧美精品久久久久久久多人混战| 樱花草www在线| 99这里只有精品视频| 精品第一国产综合精品aⅴ| 亚洲精品乱码久久久久久久| 国产一区二区三区四区五区| 日日噜噜噜夜夜爽亚洲精品| 国产真实的和子乱拍在线观看| 中文一区二区| 国产精品日日摸夜夜添夜夜av| 国产精品久久久久久久一区二区 | 麻豆国产欧美一区二区三区| 成人免费网站在线| 黄色av一区二区三区| 久久一区二区三区四区| 在线一区日本视频| 男人天堂视频在线观看| 欧美丝袜第三区| 国产吃瓜黑料一区二区| 精品国产网站| 欧美丰满老妇厨房牲生活| 欧美a∨亚洲欧美亚洲| 日韩电影一二三区| 国产精品v欧美精品∨日韩| 免费福利在线观看| 怡红院av一区二区三区| 欧美一级黄色影院| 91大神精品| 正在播放欧美一区| 日韩欧美亚洲视频| 精品午夜久久福利影院| 欧美亚洲另类在线一区二区三区| av超碰免费在线| 在线观看日韩一区| 亚洲激情 欧美| 99久久激情| 日韩免费黄色av| www.黄色片| 中文字幕亚洲不卡| 国产又黄又大又粗视频| theporn国产在线精品| 色吧影院999| 激情视频网站在线观看| 成人一道本在线| 中文字幕欧美日韩一区二区三区| 中文在线а√天堂| 精品国产自在久精品国产| 欧美巨胸大乳hitomi| 老鸭窝91久久精品色噜噜导演| 97在线中文字幕| 一级毛片视频在线| 色综合久久久久久久| 国产一级免费片| 中文字幕一区二区三区乱码图片| 国产精品伦子伦免费视频| 无码国产精品96久久久久| 一区二区三区 在线观看视频| 我要看一级黄色大片| 九九综合在线| 欧洲日韩成人av| 视频在线不卡| 婷婷久久综合九色综合伊人色| 亚洲AV成人精品| 久久久久久免费视频| 国产欧美va欧美va香蕉在| 成人精品一区| 欧美在线观看视频一区二区| 国产人妻一区二区| 丝袜亚洲另类欧美综合| 欧美日韩成人一区二区三区| 国产日韩电影| 在线观看国产精品淫| 中文字幕男人天堂| 国产精品美女久久久久久久| 天天操,天天操| 久久影院100000精品| 国产欧美日韩视频| 麻豆视频在线免费观看| 91精品欧美综合在线观看最新| 三上悠亚作品在线观看| 狠狠色综合日日| 国产香蕉一区二区三区| 麻豆视频久久| 高清欧美性猛交xxxx| 色视频免费在线观看| 欧美性猛交xxxx乱大交| 国产精品20p| 蜜桃久久久久久久| 国产又大又长又粗又黄| 国产日本亚洲| 国内久久久精品| 日韩大胆视频| 精品视频免费看| 乱h高h女3p含苞待放| 国产91在线观看丝袜| 国产素人在线观看| 精品国产一区二区三区小蝌蚪| 国产精品欧美一区二区| 羞羞视频在线观看不卡| 亚洲精美色品网站| 波多野结衣毛片| 亚洲欧美自拍偷拍色图| 久久久男人的天堂| 久久精品官网| 日韩视频在线免费播放| 国产乱人伦精品一区| 国产成人精品视频在线| 黄色网页在线免费观看| 精品国内片67194| 久久永久免费视频| 亚洲美女视频在线| 日本aaa视频| 国产在线精品一区二区 | 免费欧美日韩国产三级电影| 成年人三级视频| 免费观看不卡av| 成人女保姆的销魂服务| 黄色视屏在线免费观看| 一个色综合导航| 蜜臀久久精品久久久久| 欧美日韩综合不卡| 日本在线视频免费| 国产精品久久久久久久第一福利 | 中文字幕不卡三区| 日韩少妇一区二区| 久久国产剧场电影| 欧美日韩在线中文| 亚洲在线久久| 神马欧美一区二区| 欧美激情15p| 亚洲伊人久久综合| 免费观看成人性生生活片| 欧美日韩国产91| av电影在线观看一区二区三区| 精品国产露脸精彩对白| 中文字幕777| 欧美日韩中文字幕| 精品无码久久久久久久| 中文字幕日韩av资源站| 在线观看福利片| www.成人网.com| 日本高清一区二区视频| 久久久久久黄| 国产中文字幕二区| 午夜电影亚洲| 熟女熟妇伦久久影院毛片一区二区| 欧美网色网址| 国产精品视频免费一区二区三区| 91精品一久久香蕉国产线看观看| 国产高清在线不卡| 日韩理论视频| 韩国欧美亚洲国产| 日本动漫理论片在线观看网站| 中文字幕亚洲一区在线观看| 国产高清在线观看| 亚洲日本成人女熟在线观看| 亚洲aaa在线观看| 亚洲加勒比久久88色综合| 亚洲AV无码精品自拍| 日韩丝袜美女视频| 99热精品在线播放| 欧美一区二区三区性视频| 91在线观看喷潮| 欧美日韩国产另类不卡| 中文字幕乱码视频| 欧美日韩电影在线| 国产一区二区三区中文字幕| 欧美日韩一级视频| 一卡二卡三卡在线| 欧美一区二视频| 99国产精品久久久久久久成人| 69p69国产精品| 午夜精品久久久久久久第一页按摩 | 中文字幕亚洲区| 潮喷失禁大喷水aⅴ无码| 国产精品国产三级国产aⅴ中文| 欧洲性xxxx| 中文字幕在线不卡一区二区三区 | 亚洲成人一区在线| 国产无遮挡又黄又爽又色| 午夜精品福利在线| www亚洲视频| 欧美在线视频不卡| 在线观看亚洲国产| 日韩亚洲欧美中文三级| 性猛交xxxx乱大交孕妇印度| 精品国产一区二区三区久久久蜜月| 日本韩国在线观看| 亚洲欧美精品一区| av免费观看一区二区| 久久夜色撩人精品| av资源一区| 日韩av免费在线观看| 高清亚洲高清| 99久热re在线精品996热视频 | 亚洲精品视频中文字幕| jizz在线观看中文| 精品中文字幕乱| 色综合桃花网| 国产一区二区丝袜| 高清欧美性猛交xxxx黑人猛| 日本高清视频一区二区三区| 91精品综合| www一区二区www免费| 免费观看在线综合色| 亚洲熟女一区二区三区| 久久久久久9999| 无码人妻精品一区二区三区夜夜嗨| 亚洲成人免费视| 久久久久精彩视频| 日韩欧美123| 久久久久久久久亚洲精品| 日韩少妇与小伙激情| 日本三级一区| 亚洲一区久久久| 色爱综合av| 法国空姐在线观看免费| 久久一区二区三区超碰国产精品| 欧美一级小视频| 91免费观看视频| 国内偷拍精品视频| 欧美性xxxxxx少妇| 日本免费不卡视频| 俺去了亚洲欧美日韩| 依依综合在线| 成人欧美视频在线| 成人精品影院| 欧美黑人经典片免费观看 | 5566中文字幕一区二区| 精品一区欧美| 91丨porny丨探花| 国产在线一区观看| 免费一级特黄3大片视频| 欧美日韩精品在线观看| 99久久国产热无码精品免费| 亚洲欧洲日本专区| 国产蜜臀在线| 91在线精品播放| 欧美日韩国产一区二区三区不卡| 国产91沈先生在线播放| 卡一卡二国产精品| 亚洲第一成人网站| 午夜视黄欧洲亚洲| va视频在线观看| 综合网中文字幕| 一二区成人影院电影网| 精品视频一区在线| 伊人久久久大香线蕉综合直播| 激情久久综合网| 国产精品妹子av| 中文字幕在线网站| 亚洲欧洲日产国产网站| 无遮挡在线观看| 激情欧美一区二区三区中文字幕| 欧美日韩 国产精品| 国产又粗又猛大又黄又爽| 国产精品欧美一区二区三区| 欧美成人一区二区视频| 亚洲欧美国产一本综合首页| 亚洲十八**毛片| 久久久久网址| 亚洲一区日韩在线| 不卡一区二区在线观看| 欧美日韩视频免费播放| 香蕉视频免费在线看| 91精品国产成人www| 女一区二区三区| 黄色一级在线视频| 91在线播放网址| 六月丁香激情综合| 亚洲色在线视频| 韩国女主播一区二区| 四虎一区二区| 久久99久久久欧美国产| 国产天堂av在线| 欧美成人女星排名| 1区2区3区在线| 久久99精品国产一区二区三区| 国产精品综合| 永久免费看mv网站入口78| 欧美视频在线一区| 久久日韩视频| 91久久国产婷婷一区二区| 欧美激情第10页| 国产麻豆剧传媒精品国产av| 欧美日韩性生活视频| 高清性色生活片在线观看| 成人福利视频在线观看| 欧美jizzhd精品欧美巨大免费| 国产情侣久久久久aⅴ免费| 红桃av永久久久| 91吃瓜网在线观看| 91九色在线免费视频| 99在线|亚洲一区二区| 国产sm调教视频| 日韩免费高清av| 制服丝袜专区在线| 亚洲一区3d动漫同人无遮挡| 国产91富婆露脸刺激对白| 特一级黄色大片| 日韩视频第一页| 欧美爱爱网站| 欧美激情第3页| 亚洲午夜av在线| 成人在线视频成人| 99国产精品久久久久老师| 美女久久网站| a在线视频播放观看免费观看| 日韩经典中文字幕在线观看| 国产精品天堂蜜av在线播放| 国产精品国三级国产av| 91一区一区三区| 国产精品久久久久久无人区| 97久久伊人激情网| 99久久九九| 国产精品无码一区二区三区免费 | 亚洲最大的免费| 性色av一区二区怡红| 91嫩草|国产丨精品入口| 亚洲欧美一区二区三区情侣bbw | 欧美久久在线| 国产精品88av| 亚洲av综合一区| 高清欧美性猛交xxxx黑人猛交| 日韩一区二区中文| 色噜噜在线观看| 日韩午夜激情av| 国产精品美女午夜爽爽| 阿v天堂2017| 玉米视频成人免费看| 视频三区在线| 欧美精品七区|