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

posts - 195,  comments - 30,  trackbacks - 0

http://hi.baidu.com/daping_zhang/blog/item/e87163d06c42818fa0ec9cfc.html
多態(tài)(Polymorphism)是面向?qū)ο蟮暮诵母拍睿疚囊訡++為例,討論多態(tài)的具體實(shí)現(xiàn)。C++中多態(tài)可以分為基于繼承和虛函數(shù)的動(dòng)態(tài)多態(tài)以及基于模板的靜態(tài)多態(tài),如果沒(méi)有特別指明,本文中出現(xiàn)的多態(tài)都是指前者,也就是基于繼承和虛函數(shù)的動(dòng)態(tài)多態(tài)。至于什么是多態(tài),在面向?qū)ο笾腥绾问褂枚鄳B(tài),使用多態(tài)的好處等等問(wèn)題,如果大家感興趣的話,可以找本面向?qū)ο蟮臅?shū)來(lái)看看。
    為了方便說(shuō)明,下面舉一個(gè)簡(jiǎn)單的使用多態(tài)的例子(From [1] ):

class Shape
{
protected:
  int m_x;    // X coordinate
  int m_y;  // Y coordinate
public:
  // Pure virtual function for drawing
  virtual void Draw() = 0;  

  // A regular virtual function
  virtual void MoveTo(int newX, int newY);

 // Regular method, not overridable.
  void Erase();

  // Constructor for Shape
  Shape(int x, int y); 

 // Virtual destructor for Shape
  virtual ~Shape();
};
// Circle class declaration
class Circle : public Shape
{
private:
   int m_radius;    // Radius of the circle 
public:
   // Override to draw a circle
   virtual void Draw();    

   // Constructor for Circle
   Circle(int x, int y, int radius);

  // Destructor for Circle
   virtual ~Circle();
};
// Shape constructor implementation
Shape::Shape(int x, int y)
{
   m_x = x;
   m_y = y;
}
// Shape destructor implementation
Shape::~Shape()
{
//...
}
 // Circle constructor implementation
Circle::Circle(int x, int y, int radius) : Shape (x, y)
{
   m_radius = radius;
}

// Circle destructor implementation
Circle::~Circle()
{
//...
}

// Circle override of the pure virtual Draw method.
void Circle::Draw()
{
   glib_draw_circle(m_x, m_y, m_radius);
}

main()
{
  // Define a circle with a center at (50,100) and a radius of 25
  Shape *pShape = new Circle(50, 100, 25);

  // Define a circle with a center at (5,5) and a radius of 2
  Circle aCircle(5,5, 2);

  // Various operations on a Circle via a Shape pointer
  //Polymorphism
  pShape->Draw();
  pShape->MoveTo(100, 100);

  pShape->Erase();
  delete pShape;

 // Invoking the Draw method directly
  aCircle.Draw();
}   

     例子中使用到多態(tài)的代碼以黑體標(biāo)出了,它們一個(gè)很明顯的特征就是通過(guò)一個(gè)基類的指針(或者引用)來(lái)調(diào)用不同子類的方法。
     那么,現(xiàn)在的問(wèn)題是,這個(gè)功能是怎樣實(shí)現(xiàn)的呢?我們可以先來(lái)大概猜測(cè)一下:對(duì)于一般的方法調(diào)用,到了匯編代碼這一層次的時(shí)候,一般都是使用 Call funcaddr 這樣的指令進(jìn)行調(diào)用,其中funcaddr是要調(diào)用函數(shù)的地址。按理來(lái)說(shuō),當(dāng)我使用指針pShape來(lái)調(diào)用Draw的時(shí)候,編譯器應(yīng)該將Shape::Draw的地址賦給funcaddr,然后Call 指令就可以直接調(diào)用Shape::Draw了,這就跟用pShape來(lái)調(diào)用Shape::Erase一樣。但是,運(yùn)行結(jié)果卻告訴我們,編譯器賦給funcaddr的值卻是Circle::Drawde的值。這就說(shuō)明,編譯器在對(duì)待Draw方法和Erase方法時(shí)使用了雙重標(biāo)準(zhǔn)。那么究竟是誰(shuí)有這么大的法力,使編譯器這個(gè)鐵面無(wú)私的判官都要另眼相看呢?virtual!!
     
Clever!!正是virtual這個(gè)關(guān)鍵字一手導(dǎo)演了這一出“乾坤大挪移”的好戲。說(shuō)道這里,我們先要明確兩個(gè)概念:靜態(tài)綁定和動(dòng)態(tài)綁定。
    1、靜態(tài)綁定(static bingding),也叫早期綁定,簡(jiǎn)單來(lái)說(shuō)就是編譯器在編譯期間就明確知道所要調(diào)用的方法,并將該方法的地址賦給了Call指令的funcaddr。因此,運(yùn)行期間直接使用Call指令就可調(diào)用到相應(yīng)的方法。
    2、動(dòng)態(tài)綁定(dynamic binding),也叫晚期綁定,與靜態(tài)綁定不同,在編譯期間,編譯器并不能明確知道究竟要調(diào)用的是哪一個(gè)方法,而這,要知道運(yùn)行期間使用的具體是哪個(gè)對(duì)象才能決定。
    好了,有了這兩個(gè)概念以后,我們就可以說(shuō),virtual的作用就是告訴編譯器:我要進(jìn)行動(dòng)態(tài)綁定!編譯器當(dāng)然會(huì)尊重你的意見(jiàn),而且為了完成你這個(gè)要求,編譯器還要做很多的事情:編譯器自動(dòng)在聲明了virtual方法的類中插入一個(gè)指針vptr和一個(gè)數(shù)據(jù)結(jié)構(gòu)VTable(vptr用以指向VTable;VTable是一個(gè)指針數(shù)組,里面存放著函數(shù)的地址),并保證二者遵守下面的規(guī)則:
    1、VTable中只能存放聲明為virtual的方法,其它方法不能存放在里面。在上面的例子中,Shape的VTable中就只有Draw,MoveTo和~Shape。方法Erase的地址并不能存放在VTable中。此外,如果方法是純虛函數(shù),如 Draw,那么同樣要在VTable中保留相應(yīng)的位置,但是由于純虛函數(shù)沒(méi)有函數(shù)體,因此該位置中并不存放Draw的地址,而是可以選擇存放一個(gè)出錯(cuò)處理的函數(shù)的地址,當(dāng)該位置被意外調(diào)用時(shí),可以用出錯(cuò)函數(shù)進(jìn)行相應(yīng)的處理。
    2、派生類的VTalbe中記錄的從基類中繼承下來(lái)的虛函數(shù)地址的索引號(hào)必須跟該虛函數(shù)在基類VTable中的索引號(hào)保持一致。如在上例中,如果在Shape的VTalbe中,Draw為 1 號(hào), MoveTo 2 號(hào),~Shape為 3 號(hào),那么,不管這些方法在Circle中是按照什么順序定義的,Circle的VTable中都必須保證Draw為 1 號(hào),MoveTo為 2號(hào)。至于 3號(hào),這里是~Circle。為什么不是~Shape啊?嘿嘿,忘啦,析構(gòu)函數(shù)不會(huì)繼承的。
    3、vptr是由編譯器自動(dòng)插入生成的,因此編譯器必須負(fù)責(zé)為其進(jìn)行初始化。初始化的時(shí)間選在對(duì)象創(chuàng)建時(shí),而地點(diǎn)就在構(gòu)造函數(shù)中。因此,編譯器必須保證每個(gè)類至少有一個(gè)構(gòu)造函數(shù),若沒(méi)有,自動(dòng)為其生成一個(gè)默認(rèn)構(gòu)造函數(shù)。
     4、vptr通常放在對(duì)象的起始處,也就是Addr(obj) == Addr(obj.vptr)。
    你看,天下果然沒(méi)有免費(fèi)的午餐,為了實(shí)現(xiàn)動(dòng)態(tài)綁定,編譯器要為我們默默干了這么多的臟話累活。如果你想體驗(yàn)一下編譯器的辛勞,那么可以嘗試用C語(yǔ)言模擬一下上面的行為,【1】中就有這么一個(gè)例子。好了,現(xiàn)在萬(wàn)事具備,只欠東風(fēng)了。編譯,連接,載入,GO!當(dāng)程序執(zhí)行到 pShape->Draw()的時(shí)候,上面的設(shè)施也開(kāi)始起作用了。。
    前面已經(jīng)提到,晚期綁定時(shí)之所以不能確定調(diào)用哪個(gè)函數(shù),是因?yàn)榫唧w的對(duì)象不確定。好了,當(dāng)運(yùn)行到pShape->Draw()時(shí),對(duì)象出來(lái)了,它由pShape指針標(biāo)出。我們找到這個(gè)對(duì)象后,就可以找到它里面的vptr(在對(duì)象的起始處),有了vptr后,我們就找到了VTable,調(diào)用的函數(shù)就在眼前了。。等等,VTable中方法那么多,我究竟使用哪個(gè)呢?不用著急,編譯器早已為我們做好了記錄:編譯器在創(chuàng)建VTable時(shí),已經(jīng)為每個(gè)virtual函數(shù)安排好了座次,并且把這個(gè)索引號(hào)記錄了下來(lái)。因此,當(dāng)編譯器解析到pShape->Draw()的時(shí)候,它已經(jīng)悄悄的將函數(shù)的名字用索引號(hào)來(lái)代替了。這時(shí)候,我們通過(guò)這個(gè)索引號(hào)就可以在VTable中得到一個(gè)函數(shù)地址,Call it!
    在這里,我們就體會(huì)到為什么會(huì)有第二條規(guī)定了,通常,我們都是用基類的指針來(lái)引用派生類的對(duì)象,但是不管具體對(duì)象是哪個(gè)派生類的,我們都可以使用相同的索引號(hào)來(lái)取得對(duì)應(yīng)的函數(shù)實(shí)現(xiàn)。
     現(xiàn)實(shí)中有一個(gè)例子其實(shí)跟這個(gè)蠻像的:報(bào)警電話有110,119,120(VTable中不同的方法)。不同地方的人撥打不同的號(hào)碼所產(chǎn)生的結(jié)果都是不一樣的。譬如,在三環(huán)外的一個(gè)人(具體對(duì)象)跟一環(huán)內(nèi)的一個(gè)人(另外一個(gè)具體對(duì)象)打119,最后調(diào)用的消防隊(duì)肯定是不一樣的,這就是多態(tài)了。這是怎么實(shí)現(xiàn)的呢,每個(gè)人都知道一個(gè)報(bào)警中心(VTable,里面有三個(gè)方法 110,119,120)。如果三環(huán)外的一個(gè)人需要火警搶險(xiǎn)(一個(gè)具體對(duì)象)時(shí),它就撥打119,但是他肯定不知道最后是哪一個(gè)消防隊(duì)會(huì)出現(xiàn)的。這得有報(bào)警中心來(lái)決定,報(bào)警中心通過(guò)這個(gè)具體對(duì)象(例子中就是具體位置了)以及他說(shuō)撥打的電話號(hào)碼(可以理解成索引號(hào)),報(bào)警中心可以確定應(yīng)該調(diào)度哪一個(gè)消防隊(duì)進(jìn)行搶險(xiǎn)(不同的動(dòng)作)。
     這樣,通過(guò)vptr和VTable的幫助,我們就實(shí)現(xiàn)了C++的動(dòng)態(tài)綁定。當(dāng)然,這僅僅是單繼承時(shí)的情況,多重繼承的處理要相對(duì)復(fù)雜一點(diǎn),下面簡(jiǎn)要說(shuō)一下最簡(jiǎn)單的多重繼承的情況,至于虛繼承的情況,有興趣的朋友可以看看 Lippman的《Inside the C++ Object Model》,這里暫時(shí)就不展開(kāi)了。(主要是自己還沒(méi)搞清楚,況且現(xiàn)在多重繼承都不怎么使用了,虛繼承應(yīng)用的機(jī)會(huì)就更少了)
     首先,我要先說(shuō)一下多重繼承下對(duì)象的內(nèi)存布局,也就是說(shuō)該對(duì)象是如何存放本身的數(shù)據(jù)的。

class Cute
{
public:
 int i;
 virtual void cute(){ cout<<"Cute cute"<<endl; }
};
class Pet
{
public:
   int j;
   virtual void say(){ cout<<"Pet say"<<endl;  }
};
class Dog : public Cute,public Pet
{
public:
 int z;
 void cute(){ cout<<"Dog cute"<<endl; }
 void say(){ cout<<"Dog say"<<endl;  }
};

    在上面這個(gè)例子中,一個(gè)Dog對(duì)象在內(nèi)存中的布局如下所示:                    

Dog

Vptr1

Cute::i

Vptr2

Pet::j

Dog::z


     也就是說(shuō),在Dog對(duì)象中,會(huì)存在兩個(gè)vptr,每一個(gè)跟所繼承的父類相對(duì)應(yīng)。如果我們要想實(shí)現(xiàn)多態(tài),就必須在對(duì)象中準(zhǔn)確地找到相應(yīng)的vptr,以調(diào)用不同的方法。但是,如果根據(jù)單繼承時(shí)的邏輯,也就是vptr放在指針指向位置的起始處,那么,要在多重繼承情況下實(shí)現(xiàn),我們必須保證在將一個(gè)派生類的指針隱式或者顯式地轉(zhuǎn)換成一個(gè)父類的指針時(shí),得到的結(jié)果指向相應(yīng)派生類數(shù)據(jù)在Dog對(duì)象中的起始位置。幸好,這工作編譯器已經(jīng)幫我們完成了。上面的例子中,如果Dog向上轉(zhuǎn)換成Pet的話,編譯器會(huì)自動(dòng)計(jì)算Pet數(shù)據(jù)在Dog對(duì)象中的偏移量,該偏移量加上Dog對(duì)象的起始位置,就是Pet數(shù)據(jù)的實(shí)際地址了。

int main()
{
 Dog* d = new Dog();
 cout<<"Dog object addr : "<<d<<endl;
 Cute* c = d;
 cout<<"Cute type addr : "<<c<<endl;
 Pet* p = d;
 cout<<"Pet type addr : "<<p<<endl;
 delete d;
}
output:
Dog object addr : 0x3d24b0
Cute type addr : 0x3d24b0
Pet type addr : 0x3d24b8   // 正好指向Dog對(duì)象的vptr2處,也就是Pet的數(shù)據(jù)

      好了,既然編譯器幫我們自動(dòng)完成了不同父類的地址轉(zhuǎn)換,我們調(diào)用虛函數(shù)的過(guò)程也就跟單繼承統(tǒng)一起來(lái)了:通過(guò)具體對(duì)象,找到vptr(通常指針的起始位置,因此Cute找到的是vptr1,而Pet找到的是vptr2),通過(guò)vptr,我們找到VTable,然后根據(jù)編譯時(shí)得到的VTable索引號(hào),我們?nèi)〉孟鄳?yīng)的函數(shù)地址,接著就可以馬上調(diào)用了。

      在這里,順便也提一下兩個(gè)特殊的方法在多態(tài)中的特別之處吧:第一個(gè)是構(gòu)造函數(shù),在構(gòu)造函數(shù)中調(diào)用虛函數(shù)是不會(huì)有多態(tài)行為的,例子如下:

class Pet
{
public:
   Pet(){ sayHello(); }
   void say(){ sayHello(); }

   virtual void sayHello()
   {
     cout<<"Pet sayHello"<<endl;
   }
   
};
class Dog : public Pet
{
public:
   Dog(){};
   void sayHello()
   {
     cout<<"Dog sayHello"<<endl;
   }
};
int main()
{
 Pet* p = new Dog();
 p->sayHello();
 delete p;
}
output:
Pet sayHello //直接調(diào)用的是Pet的sayHello()
Dog sayHello //多態(tài)

     第二個(gè)就是析構(gòu)函數(shù),使用多態(tài)的時(shí)候,我們經(jīng)常使用基類的指針來(lái)引用派生類的對(duì)象,如果是動(dòng)態(tài)創(chuàng)建的,對(duì)象使用完后,我們使用delete來(lái)釋放對(duì)象。但是,如果我們不注意的話,會(huì)有意想不到的情況發(fā)生。

class Pet
{
public:
   ~Pet(){ cout<<"Pet destructor"<<endl;  }
  //virtual ~Pet(){ cout<<"Pet virtual destructor"<<endl;  }
};
class Dog : public Pet
{
public:
   ~Dog(){ cout<<"Dog destructor"<<endl;};
   //virtual ~Dog(){ cout<<"Dog virtual destructor"<<endl;  }
};
int main()
{
 Pet* p = new Dog();
 delete p;
}
output:
Pet destructor  //糟了,Dog的析構(gòu)函數(shù)沒(méi)有調(diào)用,memory leak!

如果我們將析構(gòu)函數(shù)改成virtual以后,結(jié)果如下
Dog virtual destructor
Pet virtual destructor   // That's OK!

    所以,如果一個(gè)類設(shè)計(jì)用來(lái)被繼承的話,那么它的析構(gòu)函數(shù)應(yīng)該被聲明為virtual的。

Reference:
[1] Comparing C++ and C (Inheritance and Virtual Functions)  
[2] C++對(duì)象布局及多態(tài)實(shí)現(xiàn)的探索 
[3] Multiple inheritance and the this pointer 講述多重繼承下的類型轉(zhuǎn)換問(wèn)題
[4] Memory Layout for Multiple and Virtual Inheritance 詳細(xì)描述了多重菱形多重繼承下的對(duì)象內(nèi)存布局以及類型轉(zhuǎn)換 

后記:當(dāng)我完成了本篇%90的時(shí)候,我試圖提交,誰(shuí)知道登陸太久沒(méi)有動(dòng)作,session超時(shí),讓我重新登陸,然后提交的內(nèi)容就全部不見(jiàn)了,剩下最開(kāi)始的%10。。。。當(dāng)時(shí)的心情啊,用呂大哥的話來(lái)說(shuō)就是:尋死的心都有了。

posted on 2011-04-08 22:09 luis 閱讀(393) 評(píng)論(0)  編輯 收藏 引用

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


<2012年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

文章分類

文章檔案

友情鏈接

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美在线综合| 亚洲国产成人av| 久久精品欧洲| 久久久国产精品一区二区中文| 亚洲一区二区精品视频| 亚洲欧美变态国产另类| 欧美一区二视频在线免费观看| 欧美专区在线播放| 老牛嫩草一区二区三区日本| 欧美国产日韩一二三区| 欧美日韩一区二区免费在线观看 | 亚洲清纯自拍| 欧美激情第三页| 亚洲三级视频在线观看| 亚洲手机在线| 久久久99久久精品女同性| 欧美二区不卡| 国产亚洲一级高清| 亚洲美女在线观看| 久久精品二区三区| 亚洲国产一区二区三区在线播 | 久久看片网站| 欧美一级夜夜爽| 欧美在线观看视频一区二区| 久久久久久尹人网香蕉| 欧美福利一区二区| 亚洲一区二区三区涩| 久久精品国产成人| 欧美黄色影院| 激情欧美一区二区| 亚洲伊人网站| 亚洲电影免费观看高清完整版在线 | 美女国产一区| 国产精品视频一二三| 亚洲精品久久久久久下一站 | 99精品热6080yy久久| 久久美女性网| 午夜伦理片一区| 欧美午夜精品电影| 亚洲精品视频免费| 免费高清在线视频一区·| 亚洲免费影院| 国产精品家教| 亚洲一区二区三区乱码aⅴ| 美女主播一区| 欧美在线观看一区二区| 国产精品乱码| 亚洲影院一区| 在线视频欧美日韩精品| 欧美成人有码| 亚洲国产综合91精品麻豆| 久久男人av资源网站| 欧美亚洲日本国产| 国产精品夜色7777狼人| 亚洲欧美国产精品专区久久| 一区二区三区精密机械公司| 欧美日韩在线视频一区二区| 中日韩男男gay无套| 一区二区黄色| 国产免费一区二区三区香蕉精| 亚洲欧美www| 亚洲欧美一区二区激情| 国产在线精品一区二区夜色| 久久激情视频免费观看| 欧美一区二区三区精品电影| 国产一区二区看久久| 久久久久久免费| 开心色5月久久精品| 亚洲乱码久久| 中日韩美女免费视频网址在线观看| 国产精品夫妻自拍| 久久精品视频va| 久久人人爽人人爽爽久久| 亚洲高清不卡在线| 亚洲激情亚洲| 日韩午夜黄色| 欧美影院一区| 一色屋精品视频免费看| 欧美电影专区| 欧美激情四色| 久久成人久久爱| 久久手机免费观看| 正在播放欧美一区| 亚洲欧洲av一区二区| 在线观看91精品国产入口| 亚洲国产欧美日韩另类综合| 欧美色视频一区| 久久综合色播五月| 欧美福利视频| 久久久精品国产免大香伊| 欧美高清在线精品一区| 亚洲欧美在线磁力| 久久精品在线免费观看| 一本大道久久精品懂色aⅴ| 亚洲免费在线精品一区| 91久久国产精品91久久性色| 99国内精品久久久久久久软件| 国产欧美一区视频| 亚洲黄色性网站| 国产一区二区福利| 亚洲精品一区二区三区婷婷月| 国产日韩av高清| 亚洲精品视频在线看| 国内精品伊人久久久久av影院 | 在线日韩欧美| 亚洲私拍自拍| 亚洲精品美女久久7777777| 亚洲在线观看免费| 99re6这里只有精品| 久久精品国产久精国产思思| 在线亚洲一区二区| 美女精品在线观看| 欧美在线播放视频| 欧美色道久久88综合亚洲精品| 欧美电影资源| 在线观看日韩精品| 欧美一区二区成人6969| 亚洲一区二区成人在线观看| 久久久久青草大香线综合精品| 亚洲欧美bt| 国产精品成人播放| 亚洲精品国产品国语在线app| 在线精品国精品国产尤物884a| 亚洲图片欧洲图片日韩av| 99国产欧美久久久精品| 女人天堂亚洲aⅴ在线观看| 久久米奇亚洲| 一区二区视频免费在线观看 | 亚洲人成小说网站色在线| 黄色成人在线网站| 欧美一区二区日韩| 久久免费少妇高潮久久精品99| 国产免费成人av| 午夜精品久久久| 午夜欧美不卡精品aaaaa| 欧美精品一区二区三区很污很色的| 亚洲欧洲精品成人久久奇米网 | 国产精品人成在线观看免费| 亚洲欧洲日韩综合二区| 亚洲日本成人| 欧美精品123区| 亚洲精品男同| 在线一区二区三区四区| 欧美日韩国产首页在线观看| 亚洲黄网站黄| 亚洲在线观看视频| 国产精品免费小视频| 性8sex亚洲区入口| 久久一综合视频| 亚洲激情国产| 欧美日本高清| 亚洲欧美日韩另类精品一区二区三区 | 国产精品成人一区二区网站软件| 亚洲精品一二三| 久久aⅴ国产欧美74aaa| 狠狠色丁香婷婷综合久久片| 开元免费观看欧美电视剧网站| 欧美激情第1页| 亚洲一区二区高清| 永久久久久久| 欧美激情第4页| 亚洲一区二区影院| 你懂的亚洲视频| 亚洲少妇自拍| 狠狠狠色丁香婷婷综合激情| 欧美多人爱爱视频网站| 亚洲自拍偷拍一区| 欧美国产1区2区| 亚洲欧美一区二区三区在线| 一区二区在线观看av| 欧美精品在线一区| 欧美一区二区视频在线观看2020| 欧美高清视频一区| 午夜亚洲视频| 日韩午夜中文字幕| 国内精品久久久久伊人av| 欧美日韩免费观看一区三区| 欧美在线免费看| 99精品视频一区| 亚洲大胆人体视频| 欧美一区1区三区3区公司| 91久久精品国产91性色tv| 国产日韩欧美一区二区| 欧美精品123区| 免播放器亚洲一区| 久久aⅴ国产紧身牛仔裤| 一本到高清视频免费精品| 欧美成人精品1314www| 欧美影院成年免费版| 99综合视频| 亚洲欧洲日韩综合二区| 韩曰欧美视频免费观看| 国产精品久久久久久久久果冻传媒| 久色婷婷小香蕉久久| 欧美一区二区日韩| 午夜精品99久久免费| 亚洲一级黄色av| 一本一本久久a久久精品综合麻豆| 女同性一区二区三区人了人一| 欧美在线视频全部完|