青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Shuffy

不斷的學(xué)習(xí),不斷的思考,才能不斷的進(jìn)步.Let's do better together!
posts - 102, comments - 43, trackbacks - 0, articles - 19
【轉(zhuǎn)】http://www.shnenglu.com/tiandejian/archive/2008/03/17/ec_32.html

第六章.        繼承和面向?qū)ο笤O(shè)計(jì)

面向?qū)ο蟮某绦蛟O(shè)計(jì)( OOP )風(fēng)靡計(jì)算機(jī)軟件界已經(jīng)有 20 個(gè)年頭了,因此,你或多或少會(huì)與繼承、派生以及虛函數(shù)這些事物有所接觸。即使你僅僅使用 C 語(yǔ)言編程,那你也難以徹底逃離 OOP 的大氣候。

然而, C++ 中的 OOP 與你過(guò)去常見(jiàn)的可能有所不同。繼承可以是單一的也可以是多重的,同時(shí)每個(gè)繼承鏈接可以是公 有的 (public) ,可以是受保護(hù)的 (protected) ,也可以是私有的 (private) 。每個(gè)鏈接也可以分為虛擬 (virtual) 和非虛擬兩種。另外,成員函數(shù)也有選擇的范圍:虛擬的?非虛擬的?純虛擬的?此外,與其他語(yǔ)言特征進(jìn)行交互也有需要考慮的問(wèn)題:默認(rèn)參數(shù)值是如何與虛函數(shù)相交互的?繼承是如何影響 C++ 的名字查找規(guī)則的?還有設(shè)計(jì)的問(wèn)題:如果需要將一個(gè)類設(shè)計(jì)成可修改的,那么虛函數(shù)是實(shí)現(xiàn)這一特性的最優(yōu)途徑嗎?

本章就會(huì)針對(duì)這些問(wèn)題為大家一一道來(lái)。而后,我還將向大家解釋 C++ 種特殊功能的真正含義。——也就是當(dāng)你使用一種特定的構(gòu)造方式時(shí),你真正表達(dá)出的內(nèi)容。比如說(shuō),公共繼承意味著“ A 是一個(gè) B ”,倘若你讓其表示其它的含義,那么你就會(huì)惹上麻煩。類似地,一個(gè)虛函數(shù)意味著“接口必須被繼承”,然而一個(gè)非虛函數(shù)則意味著“接口和實(shí)現(xiàn)必須都被繼承。”一個(gè) C++ 程序員如果不能恰當(dāng)?shù)膮^(qū)分這些內(nèi)容的含義,那么他的編程生涯就會(huì)顯得步履維艱。

如果你能夠深入了解 C++ 中浩瀚特征的方方面面,你將發(fā)現(xiàn)你對(duì) OOP 的見(jiàn)解將有質(zhì)的飛躍。你的見(jiàn)解將決定你對(duì)軟件系統(tǒng)的整體認(rèn)識(shí)。一旦你對(duì) C++ 的認(rèn)識(shí)變得全面而成熟了,此時(shí)你的 C++ 之路將變得一馬平川。


 

第32條:     確保公共繼承以“ A 是一個(gè) B ”形式進(jìn)行

威廉迪蒙在他的書《一些人睡去,而另一些人必須》( W. H. Freeman and Company 1974 )中講述了這樣一個(gè)故事:他在課堂上嘗試讓他的學(xué)生記住他課程中最重要的那一部分。他和他的學(xué)生講,據(jù)說(shuō)普通的英國(guó)學(xué)生僅僅能記得黑斯廷斯戰(zhàn)役發(fā)生于 1066 年。迪蒙強(qiáng)調(diào),如果有一個(gè)學(xué)生只記住了一點(diǎn)點(diǎn),他(她)記住的便是 1066 這個(gè)年號(hào)。迪蒙繼續(xù)講,對(duì)于他的課堂上的學(xué)生,只有幾條核心的信息,非常有趣的是,這些信息還包括:“安眠藥最終會(huì)導(dǎo)致失眠。”他請(qǐng)求他的學(xué)生們一定記住這些核心信息,即使把課堂中討論的所有其他的內(nèi)容都忘光也可以,整個(gè)學(xué)期他都為學(xué)生反復(fù)重復(fù)這些核心信息。

在學(xué)期末,期末考試的最后一道題是“請(qǐng)寫下這一學(xué)期中讓你銘記一生的一件東西。”當(dāng)?shù)厦砷喚淼臅r(shí)候,差點(diǎn)兒沒(méi)昏過(guò)去。幾乎所有的學(xué)生不約而同地寫下了“ 1066 ”。

因此,我“誠(chéng)惶誠(chéng)恐”地向各位講述 C++ 面向?qū)ο缶幊讨凶顬橹匾囊粭l原則:公共繼承意味著“ A 是一個(gè) B ”關(guān)系。這條原則一定要銘記在心。

如果你編寫了 B 類( Base ,基類),并編寫了由其派生出的 D 類( Derived ,派生類),那么你就告訴了 C++ 編譯器(以及代碼的讀者),每一個(gè) D 類型的對(duì)象同時(shí)也是 B 類型的,但是反過(guò)來(lái)不成立。我們說(shuō) B 表示比 D 更加一般化的內(nèi)容,而 D 則表示比 B 更加具體化的內(nèi)容。另外我們還強(qiáng)調(diào)如果一個(gè) B 類型的對(duì)象可以在某處使用時(shí),那么 D 類型的對(duì)象一定可以在此使用。這是因?yàn)?/span> D 類型的每個(gè)對(duì)象一定是 B 類型的。反之,如果某一刻你需要一個(gè) D 類型的對(duì)象,那么一個(gè) B 類型的對(duì)象則不一定能滿足要求:每個(gè) D 都是一個(gè) B ,但反之不然。

C++ 嚴(yán)格按上述方式解釋公共繼承。請(qǐng)參見(jiàn)下面的示例:

class Person {...};

 

class Student: public Person {...};

我們從生活的經(jīng)驗(yàn)中可以得知:每個(gè)學(xué)生都是一個(gè)人,但是并不是每個(gè)人都是學(xué)生。上面的代碼正體現(xiàn)了這一層次結(jié)構(gòu)。我們期望“人”的每一條屬性對(duì)“學(xué)生”都適用(比如一個(gè)人有他的出生日期,學(xué)生也有)。但是對(duì)學(xué)生能成立的屬性對(duì)于一般的人來(lái)說(shuō)并不一定成立(比如一個(gè)學(xué)生被某所大學(xué)錄取了,但不是每個(gè)人都會(huì)去上大學(xué))。人的概念比學(xué)生的概念更加寬泛,而學(xué)生是一類特殊的人。

C++ 領(lǐng)域中,一切需要使用 Person 類型參數(shù)的函數(shù)同樣能夠接受 Student 對(duì)象(或指向 Student 的指針或引用):

void eat(const Person& p);             // 人人都會(huì)吃飯

 

void study(const Student& s);          // 只有學(xué)生會(huì)學(xué)習(xí)

 

Person p;                              // p 是一個(gè)人

Student s;                             // s 是一個(gè)學(xué)生

 

eat(p);                                // 正確, p 是一個(gè)人

 

eat(s);                                // 正確 , s 是一個(gè)學(xué)生,

                                       // 同時(shí)一個(gè)學(xué)生是一個(gè)人

 

study(s);                              // 正確

 

study(p);                              // 錯(cuò)誤! p 不一定是學(xué)生

這一點(diǎn)僅僅在公共繼承的情況下成立。只有在 Student 是公有派生自 Person 類時(shí), C++ 才會(huì)按剛才米阿術(shù)的情景運(yùn)行。私有繼承則意味著派生出的某些內(nèi)容是全新的。受保護(hù)的繼承今天暫且不談。

公共繼承和“ A 是一個(gè) B ”的等價(jià)性聽(tīng)上去很簡(jiǎn)單,但是某些時(shí)候你的直覺(jué)會(huì)誤導(dǎo)你。比如說(shuō),一只企鵝是一只鳥,這是千真萬(wàn)確的,同只鳥會(huì)飛,這是不爭(zhēng)的事實(shí)。如果我們?cè)?/span> C++ 中如此幼稚地表述這一情景,那么我們將得到:

class Bird {

public:

 virtual void fly();                  // 鳥類可以飛行

 

 ...

};

 

class Penguin:public Bird {            // 企鵝是鳥

 ...

};

瞬間我們陷入泥潭,因?yàn)檫@一層次結(jié)構(gòu)中,企鵝竟然會(huì)飛!這顯然是荒謬的。那么問(wèn)題出在哪里呢?

這種情況下,我們成為了一種不精確的語(yǔ)言 —— 英語(yǔ)的受害者。當(dāng)我們說(shuō)“ 鳥類能夠飛行”時(shí),我們的意思并不是說(shuō)所有的鳥類都會(huì)飛。在一般情況下,只有擁有飛行能力的鳥類才能夠飛。假如我們的語(yǔ)言更加精確些,我們就能認(rèn)識(shí)到世界上還存在著一些不會(huì)飛的鳥類,我們也就能構(gòu)建出下面的層次結(jié)構(gòu),這樣的機(jī)構(gòu)才更加貼近真實(shí)世界:

class Bird {

 ...                                  // 不聲明任何飛行函數(shù)

};

 

class FlyingBird: public Bird {

public:

 virtual void fly();

 ...

};

 

class Penguin: public Bird {

 

 ...                                   // 不聲明任何飛行函數(shù)

 

};

這一層次結(jié)構(gòu)比原先設(shè)計(jì)的更加忠實(shí)于我們所了解的世界。

到目前為止,上文的飛禽問(wèn)題尚未徹底明了,因?yàn)樵谝恍┸浖到y(tǒng)中,區(qū)分鳥類是否可以飛行這項(xiàng)工作是沒(méi)有意義的,如果你的程序主要是關(guān)于鳥類的喙和翅膀,而與飛行沒(méi)有什么關(guān)系,那么原先的 2 個(gè)類的層次結(jié)構(gòu)就可以滿足要求了。這里也很清晰的反映出了這一哲理:凡事并不存在一勞永逸的解決方案。對(duì)軟件系統(tǒng)而言,最好的設(shè)計(jì)一定會(huì)考慮到這個(gè)系統(tǒng)是用來(lái)做什么的,無(wú)論是現(xiàn)在還是未來(lái),如果你的程序?qū)︼w行的問(wèn)題一無(wú)所知,并且也不準(zhǔn)備去了解,那么忽略飛行特性的設(shè)計(jì)方案很可能就是完美的。事實(shí)上,這樣做要比將兩者區(qū)分開(kāi)的設(shè)計(jì)方案更好些,因?yàn)槟阏谀M的世界中很可能不會(huì)存在這一機(jī)制。

對(duì)于解決上文中的“白馬非馬”的問(wèn)題,還存在另外一個(gè)思考方法。那就是為企鵝重新定義 fly 函數(shù),從而讓其產(chǎn)生一個(gè)運(yùn)行是錯(cuò)誤:

void error(const std::string& msg);    // 定義的內(nèi)容在其他地方

 

class Penguin: public Bird {

public:

 virtual void fly() { error(" 嘗試讓一只 企鵝飛行! ”);}

 

 ...

 

};

一定要認(rèn)識(shí)到:這樣做不一定能達(dá)到預(yù)期效果。因?yàn)檫@并不是說(shuō)“企鵝不會(huì)飛”,而是說(shuō)“企鵝會(huì)飛,但是在它嘗試飛行時(shí)出錯(cuò)了”。

如何找出兩者的區(qū)別呢?我們從捕獲錯(cuò)誤的時(shí)機(jī)入手:“企鵝不能飛”的指令可以由編譯器做出保證,但是對(duì)于“企鵝真正嘗試飛行是一個(gè)錯(cuò)誤”這一規(guī)則的違背只能夠在運(yùn)行時(shí)捕獲。

為了表達(dá)這一契約,“企鵝不能飛行——句號(hào)”,你要確認(rèn)企鵝對(duì)象一定沒(méi)有飛行函數(shù)定義:

class Bird {

 

 ...                                  // 不聲明任何飛行函數(shù)

 

};

 

class Penguin: public Bird {

 

 ...                                  // 不聲明任何飛行函數(shù)

 

};

現(xiàn)在,如果你嘗試讓一個(gè)企鵝飛行,那么編譯器將對(duì)你的侵犯行為做出抗議:

Penguin p;

 

p.fly();                               / 錯(cuò)誤!

如果你適應(yīng)了“產(chǎn)生運(yùn)行時(shí)錯(cuò)誤”的方法,上文代碼的行為則與你所了解的大相徑庭。使用上文中的方法,編譯器不會(huì)對(duì) p.fly 的調(diào)用做出任何反應(yīng)。第 18 條中解釋了好的接口設(shè)計(jì)能夠防止非法代碼得到編譯。因此你最好使用在編譯室拒絕企鵝嘗試飛行的設(shè)計(jì)方案,而不是僅僅在運(yùn)行時(shí)捕獲錯(cuò)誤。

可能你承認(rèn)你的鳥類學(xué)知識(shí)并不豐富,但對(duì)于初級(jí)幾何你還是有信心的吧,讓我們拿長(zhǎng)方形和正方形再舉一個(gè)例子,這沒(méi)有什么復(fù)雜的吧?

好的,讓我們回答一個(gè)簡(jiǎn)單的問(wèn)題: Square (正方形)類是否應(yīng)該公共繼承自 Rectangle 長(zhǎng)方形)類?

 

Untitled.jpg

你會(huì)說(shuō):“當(dāng)然可以了!正方形就是一個(gè)長(zhǎng)方形,這地球人都知道。但反過(guò)來(lái)就不成立了。”這一點(diǎn)至少在學(xué)校里是正確的,但我們都已經(jīng)不是小學(xué)生了,請(qǐng)考慮下面的代碼:

class Rectangle {

public:

 virtual void setHeight(int newHeight);

 virtual void setWidth(int newWidth);

 

 virtual int height() const;          // 返回當(dāng)前值

 virtual int width() const;

 

 ...

 

};

 

void makeBigger(Rectangle& r)          // 增加 r 面積的函數(shù)

{

 int oldHeight = r.height();

 

 r.setWidth(r.width() + 10);          // r 的寬增加 10

 

 assert(r.height() == oldHeight);     // 斷言 r 的高不變

}

顯然地,這里的判斷永遠(yuǎn)不會(huì)失敗, makeBigger 僅僅改變了 r 的寬,它 的高始終沒(méi)有改變。

現(xiàn)在請(qǐng)觀察下面的代碼,其中使用了公共繼承,從而使得正方形得到與長(zhǎng)方形一致的待遇:

class Square: public Rectangle {...};

 

Square s;

 

...

 

assert(s.width() == s.height());       // 這對(duì)所有的正方形都成立

 

makeBigger(s);                         // 根據(jù)繼承關(guān)系, s 是一個(gè)長(zhǎng)方形

                                       // 因此我們可以增加它的面積

 

assert(s.width() == s.height());       // 對(duì)所有的正方形也應(yīng)成立

第二次判斷同樣不應(yīng)該出錯(cuò),這也是十分明顯的。因?yàn)檎叫蔚亩x要求長(zhǎng)寬值永遠(yuǎn)相等。

但是現(xiàn)在我們又遇到了一個(gè)問(wèn)題,我們?nèi)绾谓鉀Q下面的沖突呢?

在調(diào)用 makeBigger 之前, s 的高與寬相等;

makeBigger 內(nèi)部, s 的寬值該變了,但是高沒(méi)有;

makerBigger 返回后, s 的高與寬又相等了。(請(qǐng)注意: s 是通過(guò)引用傳入 makeBigger 中的,因此 makeBigger 改變的是 s 本身,而不是 s 的副本。)

歡迎來(lái)到公共繼承的美妙世界。在這里,你在其他領(lǐng)域(包括數(shù)學(xué))所積累的經(jīng)驗(yàn)也許不會(huì)按部就班地奏效。這種情況下最基本的問(wèn)題就是:一些對(duì)長(zhǎng)方形可用的屬性(它的長(zhǎng)、寬可以分別修改),對(duì)于正方形而言并不適用(它的長(zhǎng)、寬必須保持一致)。但是,公共繼承要求對(duì)基類成立的一切屬性對(duì)于派生類同樣應(yīng)該能夠成立——一切屬性!這種情況下,長(zhǎng)方形和正方形(以及第 38 條中集合、線性表)的實(shí)例都會(huì)遇到問(wèn)題。因此,使用公共繼承來(lái)構(gòu)建它們之間的關(guān)系顯然是錯(cuò)誤的。編譯器會(huì)允許你這樣做,但是就像我們剛剛所看到的一樣,我們無(wú)法確保代碼是否能夠按要求運(yùn)行。這件事每一位程序員一定深有體會(huì)(往往比其他行業(yè)的人要深得多),這是因?yàn)樵S多情況下代碼能夠通過(guò)編譯,卻并不意味著它能夠正常運(yùn)行。

在我們擁入面向?qū)ο蟪绦蛟O(shè)計(jì)的懷抱時(shí),多年積累的編程經(jīng)驗(yàn)難道成為了我們的絆腳石嗎?這一點(diǎn)你無(wú)需顧慮。舊有的知識(shí)依然是寶貴的,只是既然你已經(jīng)把繼承的概念添加進(jìn)你大腦中的設(shè)計(jì)方案庫(kù)中,你就應(yīng)該以全新的眼光來(lái)開(kāi)拓自己的感官世界,從而使你在面對(duì)包含繼承的程序時(shí)不會(huì)迷失方向。假如有人向你展示了一個(gè)幾頁(yè)長(zhǎng)的程序,你也可以從企鵝繼承自鳥類、正方形繼承自長(zhǎng)方形這些示例所包含的理念中,找出同樣有趣的東西。這有可能是完成工作的正確途徑,只是這個(gè)可能性并不大。

類間的關(guān)系并不僅限于“ A 是一個(gè) B ”關(guān)系。另外還存在兩個(gè)內(nèi)部類關(guān)系,它們是:“ A 擁有一個(gè) B ”、“ A 是以 B 的形式實(shí)現(xiàn)的”。這些關(guān)系將在第 38 條和第 39 條中講解。由于人們往往會(huì)將上面兩種關(guān)系其中之一錯(cuò)誤地構(gòu)造成“ A 是一個(gè) B ”,因此隨之帶來(lái)的 C++ 設(shè)計(jì)錯(cuò)誤比比皆是,所以你應(yīng)該確保對(duì)于這些關(guān)系之間的區(qū)別有著充分的理解,只有這樣你才能在 C++ 中分別對(duì)這些關(guān)系做出最優(yōu)秀的構(gòu)造。

銘記在心

公共繼承意味著 “A 是一個(gè) B” 的關(guān)系。對(duì)于基類成立的一切都應(yīng)該適用于派生類,因?yàn)榕缮惖膶?duì)象就是一個(gè)基類對(duì)象。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲激情小视频| 极品少妇一区二区三区| 亚洲精品久久久久中文字幕欢迎你| 久久国产精品网站| 欧美一区二区三区另类| 国精品一区二区三区| 老司机精品导航| 久久影院亚洲| 在线视频精品| 亚洲一区二区欧美日韩| 国产在线精品成人一区二区三区| 久久亚洲精品中文字幕冲田杏梨| 免费一区二区三区| 一区二区三区|亚洲午夜| 亚洲午夜精品| 影音先锋久久| 亚洲狼人精品一区二区三区| 国产精品私房写真福利视频| 久久综合色综合88| 国产精品chinese| 嫩模写真一区二区三区三州| 欧美日韩一级视频| 久久久久久久综合日本| 欧美精品激情| 久久米奇亚洲| 欧美日韩综合久久| 女主播福利一区| 国产精品国产三级国产aⅴ浪潮 | 国产精品国码视频| 裸体女人亚洲精品一区| 欧美午夜无遮挡| 欧美成人精品在线播放| 国产精品久久久久9999| 亚洲国产精品久久久久| 欧美日韩在线直播| 欧美高清在线一区| 国产日韩精品一区二区三区| 亚洲精品国产精品乱码不99| 黑人巨大精品欧美一区二区小视频 | 亚洲午夜久久久久久久久电影网| 久久国产免费| 亚洲一区国产视频| 蜜桃av一区| 久久午夜色播影院免费高清| 国产精品国产三级国产专播精品人| 欧美电影免费观看大全| 国产一区三区三区| 亚洲一区在线视频| 亚洲一区二区欧美日韩| 欧美精品成人一区二区在线观看| 久久亚洲综合网| 国产三级精品在线不卡| 亚洲一区二区伦理| 欧美视频中文一区二区三区在线观看| 欧美高清在线观看| 亚洲国内高清视频| 狂野欧美激情性xxxx| 久久精品中文| 国产日产欧产精品推荐色| 中文av一区特黄| 亚洲女ⅴideoshd黑人| 欧美日韩一区二区三| 亚洲精品裸体| 亚洲小视频在线观看| 欧美日韩ab片| 夜色激情一区二区| 亚洲欧美日韩视频二区| 国产精品va在线播放我和闺蜜| 日韩亚洲在线观看| 亚洲欧美日韩一区在线| 欧美天天在线| 亚洲欧美欧美一区二区三区| 欧美一级午夜免费电影| 国产日韩专区| 久久久久国产精品www| 男人天堂欧美日韩| 亚洲三级影院| 国产精品草草| 欧美一区二区三区久久精品茉莉花| 久久美女性网| 亚洲精品一区二区三区在线观看| 欧美精品在线观看| 一区二区日韩| 欧美在线电影| 亚洲激情成人网| 国产精品成人一区二区网站软件| 亚洲欧美中文字幕| 欧美69视频| 亚洲一区二区av电影| 国产欧美69| 美女爽到呻吟久久久久| 9i看片成人免费高清| 久久精品国产成人| 亚洲人成在线观看网站高清| 国产精品www色诱视频| 欧美一区日韩一区| 亚洲精品老司机| 久久国产精品黑丝| 亚洲精品日韩久久| 国产欧美精品日韩区二区麻豆天美 | 母乳一区在线观看| 一区二区三区四区五区视频| 国产一区二区三区奇米久涩 | 欧美一区深夜视频| 亚洲国产精品免费| 欧美一区二区三区视频在线| 亚洲精品一区二区三区在线观看 | 国产亚洲人成a一在线v站| 欧美成人69av| 欧美一级片一区| 日韩网站在线| 欧美激情成人在线视频| 欧美一级网站| 亚洲一区二区高清| 亚洲精品一区二区三| 国产一区二区看久久| 欧美国产欧美综合 | 亚洲美女电影在线| 久久香蕉国产线看观看网| 亚洲永久免费精品| 亚洲人成人一区二区在线观看| 国产麻豆精品theporn| 欧美绝品在线观看成人午夜影视 | 亚洲欧美另类国产| 一区二区三区日韩在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整 | 国产欧美精品一区| 国产精品成人在线观看| 欧美日本国产一区| 女主播福利一区| 久久久久久久97| 久久爱另类一区二区小说| 一区二区三区欧美在线观看| 日韩亚洲成人av在线| 亚洲人体1000| 亚洲精品网址在线观看| 亚洲欧洲一区二区三区久久| 亚洲国产精品传媒在线观看| 欧美a级在线| 欧美国产免费| 91久久精品视频| 亚洲精华国产欧美| 亚洲人成网站精品片在线观看 | 巨胸喷奶水www久久久免费动漫| 久久国产精品99国产| 久久精品女人天堂| 久久综合图片| 欧美高清视频| 亚洲国产国产亚洲一二三| 亚洲国产精品久久人人爱蜜臀| 亚洲国产精品va在线观看黑人| 亚洲精品美女91| 一本色道久久综合狠狠躁篇的优点| 99国产精品国产精品毛片| 一区二区高清视频| 亚洲欧美日本在线| 久久精品噜噜噜成人av农村| 久久久久综合网| 欧美国产日本高清在线| 欧美日韩大片一区二区三区| 国产精品久久中文| 国产亚洲精品自拍| 亚洲国产精品99久久久久久久久| 亚洲人成在线免费观看| 亚洲一区制服诱惑| 久久大香伊蕉在人线观看热2| 久久在线播放| 亚洲九九九在线观看| 亚洲一区二区精品在线观看| 久久人人爽爽爽人久久久| 欧美刺激午夜性久久久久久久| 欧美三日本三级三级在线播放| 国产精品亚洲综合天堂夜夜| 怡红院精品视频| 亚洲天堂网站在线观看视频| 久久理论片午夜琪琪电影网| 亚洲欧洲在线播放| 亚洲欧美999| 欧美a一区二区| 国产噜噜噜噜噜久久久久久久久 | 欧美日韩一区综合| 国产一区二区久久久| 日韩视频在线观看国产| 在线观看中文字幕不卡| 一本色道久久综合亚洲二区三区| 欧美在线观看视频一区二区三区| 亚洲成人自拍视频| 亚洲在线观看| 欧美精品一区二区三区高清aⅴ| 国产精品你懂的| 亚洲精品永久免费| 久久久精品欧美丰满| 一本色道久久88综合亚洲精品ⅰ| 久久琪琪电影院| 国产日韩欧美一区二区三区四区| 99综合精品| 男同欧美伦乱| 久久精品中文字幕一区| 国产精品美女在线| 亚洲神马久久|