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

posts - 200, comments - 8, trackbacks - 0, articles - 0

作者:July。
出處:http://blog.csdn.net/v_JULY_v 。

 

前奏

    有關(guān)虛函數(shù)的問(wèn)題層出不窮,有關(guān)虛函數(shù)的文章千篇一律,那為何還要寫(xiě)這一篇有關(guān)虛函數(shù)的文章呢?看完本文后,相信能懂其意義之所在。同時(shí),原狂想曲系列已經(jīng)更名為程序員編程藝術(shù)系列,因?yàn)椴辉僦粚W⒂?#8220;面試”,而在“編程”之上了。ok,如果有不正之處,望不吝賜教。謝謝。


第一節(jié)、一道簡(jiǎn)單的虛函數(shù)的面試題
題目要求:寫(xiě)出下面程序的運(yùn)行結(jié)果?

  1. //謝謝董天喆提供的這道百度的面試題   
  2. #include <iostream>  
  3. using namespace std;  
  4. class A{  
  5.   public:virtual void p()   
  6.   {   
  7.     cout << "A" << endl;   
  8.   }  
  9. };  
  10.   
  11. class B : public A  
  12. {  
  13.   public:virtual void p()   
  14.   { cout << "B" << endl;  
  15.   }  
  16. };  
  17.   
  18. int main()   
  19. {  
  20.   A * a = new A;  
  21.   A * b = new B;  
  22.   a->p();  
  23.   b->p();  
  24.   delete a;  
  25.   delete b;      
  26.   return 0;  
  27. }  

 

    我想,這道面試題應(yīng)該是考察虛函數(shù)相關(guān)知識(shí)的相對(duì)簡(jiǎn)單的一道題目了。然后,希望你碰到此類有關(guān)虛函數(shù)的面試題,不論其難度是難是易,都能夠舉一反三,那么本章的目的也就達(dá)到了。ok,請(qǐng)跟著我的思路,咱們步步深入(上面程序的輸出結(jié)果為A B)。

 

 

第二節(jié)、有無(wú)虛函數(shù)的區(qū)別
      1、當(dāng)上述程序中的函數(shù)p()不是虛函數(shù),那么程序的運(yùn)行結(jié)果是如何?即如下代碼所示:

class A
{
public:
 void p() 
 { 
  cout << "A" << endl; 
 }
 
};

class B : public A
{
public:
 void p() 
 { 
  cout << "B" << endl;
 }
};

對(duì)的,程序此時(shí)將輸出兩個(gè)A,A。為什么?
我們知道,在構(gòu)造一個(gè)類的對(duì)象時(shí),如果它有基類,那么首先將構(gòu)造基類的對(duì)象,然后才構(gòu)造派生類自己的對(duì)象。如上,A* a=new A,調(diào)用默認(rèn)構(gòu)造函數(shù)構(gòu)造基類A對(duì)象,然后調(diào)用函數(shù)p(),a->p();輸出A,這點(diǎn)沒(méi)有問(wèn)題。
    然后,A * b = new B;,構(gòu)造了派生類對(duì)象B,B由于是基類A的派生類對(duì)象,所以會(huì)先構(gòu)造基類A對(duì)象,然后再構(gòu)造派生類對(duì)象,但由于當(dāng)程序中函數(shù)是非虛函數(shù)調(diào)用時(shí),B類對(duì)象對(duì)函數(shù)p()的調(diào)用時(shí)在編譯時(shí)就已靜態(tài)確定了,所以,不論基類指針b最終指向的是基類對(duì)象還是派生類對(duì)象,只要后面的對(duì)象調(diào)用的函數(shù)不是虛函數(shù),那么就直接無(wú)視,而調(diào)用基類A的p()函數(shù)。

      2、那如果加上虛函數(shù)呢?即如最開(kāi)始的那段程序那樣,程序的輸出結(jié)果,將是什么?
在此之前,我們還得明確以下兩點(diǎn):
    a、通過(guò)基類引用或指針調(diào)用基類中定義的函數(shù)時(shí),我們并不知道執(zhí)行函數(shù)的對(duì)象的確切類型,執(zhí)行函數(shù)的對(duì)象可能是基類類型的,也可能是派生類型的。
    b、如果調(diào)用非虛函數(shù),則無(wú)論實(shí)際對(duì)象是什么類型,都執(zhí)行基類類型所定義的函數(shù)(如上述第1點(diǎn)所述)。如果調(diào)用虛函數(shù),則直到運(yùn)行時(shí)才能確定調(diào)用哪個(gè)函數(shù),運(yùn)行的虛函數(shù)是引用所綁定的或指針?biāo)赶虻膶?duì)象所屬類型定義的版本。

根據(jù)上述b的觀點(diǎn),我們知道,如果加上虛函數(shù),如上面這道面試題,

class A
{
public:
 virtual void p() 
 { 
  cout << "A" << endl; 
 }
 
};

class B : public A
{
public:
 virtual void p() 
 { 
  cout << "B" << endl;
 }
};

int main() 
{
 A * a = new A;
 A * b = new B;
 a->p();
 b->p();
 delete a;
 delete b;
    return 0;
}

 

那么程序的輸出結(jié)果將是A B。

所以,至此,咱們的這道面試題已經(jīng)解決。但虛函數(shù)的問(wèn)題,還沒(méi)有解決。


第三節(jié)、虛函數(shù)的原理與本質(zhì)
    我們已經(jīng)知道,虛(virtual)函數(shù)的一般實(shí)現(xiàn)模型是:每一個(gè)類(class)有一個(gè)虛表(virtual table),內(nèi)含該class之中有作用的虛(virtual)函數(shù)的地址,然后每個(gè)對(duì)象有一個(gè)vptr,指向虛表(virtual table)的所在。

請(qǐng)?jiān)试S我援引自深度探索c++對(duì)象模型一書(shū)上的一個(gè)例子:

class Point { 
public: 
   virtual ~Point();  

   virtual Point& mult( float ) = 0; 

   float x() const { return _x; }     //非虛函數(shù),不作存儲(chǔ)
   virtual float y() const { return 0; }  
   virtual float z() const { return 0; }  
   // ...

protected: 
   Point( float x = 0.0 ); 
   float _x; 
};

      1、在Point的對(duì)象pt中,有兩個(gè)東西,一個(gè)是數(shù)據(jù)成員_x,一個(gè)是_vptr_Point。其中_vptr_Point指向著virtual table point,而virtual table(虛表)point中存儲(chǔ)著以下東西:

  • virtual ~Point()被賦值slot 1,
  • mult() 將被賦值slot 2.
  • y() is 將被賦值slot 3
  • z() 將被賦值slot 4.

class Point2d : public Point { 
public: 
   Point2d( float x = 0.0, float y = 0.0 )  
      : Point( x ), _y( y ) {} 
   ~Point2d();   //1

   //改寫(xiě)base class virtual functions 
   Point2d& mult( float );  //2
   float y() const { return _y; }  //3

protected: 
   float _y; 
};

      2、在Point2d的對(duì)象pt2d中,有三個(gè)東西,首先是繼承自基類pt對(duì)象的數(shù)據(jù)成員_x,然后是pt2d對(duì)象本身的數(shù)據(jù)成員_y,最后是_vptr_Point。其中_vptr_Point指向著virtual table point2d。由于Point2d繼承自Point,所以在virtual table point2d中存儲(chǔ)著:改寫(xiě)了的其中的~Point2d()、Point2d& mult( float )、float y() const,以及未被改寫(xiě)的Point::z()函數(shù)。

class Point3d: public Point2d { 
public: 
   Point3d( float x = 0.0, 
            float y = 0.0, float z = 0.0 ) 
      : Point2d( x, y ), _z( z ) {} 
   ~Point3d();

   // overridden base class virtual functions 
   Point3d& mult( float ); 
   float z() const { return _z; }

   // ... other operations ... 
protected: 
   float _z; 
};

      3、在Point3d的對(duì)象pt3d中,則有四個(gè)東西,一個(gè)是_x,一個(gè)是_vptr_Point,一個(gè)是_y,一個(gè)是_z。其中_vptr_Point指向著virtual table point3d。由于point3d繼承自point2d,所以在virtual table point3d中存儲(chǔ)著:已經(jīng)改寫(xiě)了的point3d的~Point3d(),point3d::mult()的函數(shù)地址,和z()函數(shù)的地址,以及未被改寫(xiě)的point2d的y()函數(shù)地址。

ok,上述1、2、3所有情況的詳情,請(qǐng)參考下圖。

本文,日后可能會(huì)酌情考慮增補(bǔ)有關(guān)內(nèi)容。ok,更多,可參考深度探索c++對(duì)象模型一書(shū)第四章。
最近幾章難度都比較小,是考慮到狂想曲有深有淺的原則,后續(xù)章節(jié)會(huì)逐步恢復(fù)到相應(yīng)難度。

 

第四節(jié)、虛函數(shù)的布局與匯編層面的考察

      ivan、老夢(mèng)的兩篇文章繼續(xù)對(duì)虛函數(shù)進(jìn)行了一番深入,我看他們已經(jīng)寫(xiě)得很好了,我就不饒舌了。ok,請(qǐng)看:1、VC虛函數(shù)布局引發(fā)的問(wèn)題,2、從匯編層面深度剖析C++虛函數(shù)、http://blog.csdn.net/linyt/archive/2011/04/20/6336762.aspx。

 

第五節(jié)、虛函數(shù)表的詳解

    本節(jié)全部?jī)?nèi)容來(lái)自淄博的共享,非常感謝。注@molixiaogemao:只有發(fā)生繼承的時(shí)候且父類子類都有virtual的時(shí)候才會(huì)出現(xiàn)虛函數(shù)指針,請(qǐng)不要忘了虛函數(shù)出現(xiàn)的目的是為了實(shí)現(xiàn)多態(tài)。
 

 一般繼承(無(wú)虛函數(shù)覆蓋)
 下面,再讓我們來(lái)看看繼承時(shí)的虛函數(shù)表是什么樣的。假設(shè)有如下所示的一個(gè)繼承關(guān)系:

請(qǐng)注意,在這個(gè)繼承關(guān)系中,子類沒(méi)有重載任何父類的函數(shù)。那么,在派生類的實(shí)例中,

 對(duì)于實(shí)例:Derive d; 的虛函數(shù)表如下:


我們從表中可以看到下面幾點(diǎn),
 1)覆蓋的f()函數(shù)被放到了虛表中原來(lái)父類虛函數(shù)的位置。
 2)沒(méi)有被覆蓋的函數(shù)依舊。
 
 這樣,我們就可以看到對(duì)于下面這樣的程序,
 Base *b = new Derive();

b->f();

由b所指的內(nèi)存中的虛函數(shù)表的f()的位置已經(jīng)被Derive::f()函數(shù)地址所取代,
于是在實(shí)際調(diào)用發(fā)生時(shí),是Derive::f()被調(diào)用了。這就實(shí)現(xiàn)了多態(tài)。


多重繼承(無(wú)虛函數(shù)覆蓋)

下面,再讓我們來(lái)看看多重繼承中的情況,假設(shè)有下面這樣一個(gè)類的繼承關(guān)系(注意:子類并沒(méi)有覆蓋父類的函數(shù)):


我們可以看到:
1) 每個(gè)父類都有自己的虛表。
2) 子類的成員函數(shù)被放到了第一個(gè)父類的表中。(所謂的第一個(gè)父類是按照聲明順序來(lái)判斷的)

這樣做就是為了解決不同的父類類型的指針指向同一個(gè)子類實(shí)例,而能夠調(diào)用到實(shí)際的函數(shù)。


多重繼承(有虛函數(shù)覆蓋)
下面我們?cè)賮?lái)看看,如果發(fā)生虛函數(shù)覆蓋的情況。
下圖中,我們?cè)谧宇愔懈采w了父類的f()函數(shù)。


我們可以看見(jiàn),三個(gè)父類虛函數(shù)表中的f()的位置被替換成了子類的函數(shù)指針。
這樣,我們就可以任一靜態(tài)類型的父類來(lái)指向子類,并調(diào)用子類的f()了。如:

Derive d;
Base1 *b1 = &d;
Base2 *b2 = &d;
Base3 *b3 = &d;
b1->f(); //Derive::f()
b2->f(); //Derive::f()
b3->f(); //Derive::f()
b1->g(); //Base1::g()
b2->g(); //Base2::g()
b3->g(); //Base3::g()

 

安全性
每次寫(xiě)C++的文章,總免不了要批判一下C++。
這篇文章也不例外。通過(guò)上面的講述,相信我們對(duì)虛函數(shù)表有一個(gè)比較細(xì)致的了解了。
水可載舟,亦可覆舟。下面,讓我們來(lái)看看我們可以用虛函數(shù)表來(lái)干點(diǎn)什么壞事吧。

一、通過(guò)父類型的指針訪問(wèn)子類自己的虛函數(shù)
我們知道,子類沒(méi)有重載父類的虛函數(shù)是一件毫無(wú)意義的事情。因?yàn)槎鄳B(tài)也是要基于函數(shù)重載的。
雖然在上面的圖中我們可以看到Base1的虛表中有Derive的虛函數(shù),但我們根本不可能使用下面的語(yǔ)句來(lái)調(diào)用子類的自有虛函數(shù):

Base1 *b1 = new Derive();
b1->g1(); //編譯出錯(cuò)

任何妄圖使用父類指針想調(diào)用子類中的未覆蓋父類的成員函數(shù)的行為都會(huì)被編譯器視為非法,即基類指針不能調(diào)用子類自己定義的成員函數(shù)。所以,這樣的程序根本無(wú)法編譯通過(guò)。
但在運(yùn)行時(shí),我們可以通過(guò)指針的方式訪問(wèn)虛函數(shù)表來(lái)達(dá)到違反C++語(yǔ)義的行為。
(關(guān)于這方面的嘗試,通過(guò)閱讀后面附錄的代碼,相信你可以做到這一點(diǎn))

二、訪問(wèn)non-public的虛函數(shù)
另外,如果父類的虛函數(shù)是private或是protected的,但這些非public的虛函數(shù)同樣會(huì)存在于虛函數(shù)表中,
所以,我們同樣可以使用訪問(wèn)虛函數(shù)表的方式來(lái)訪問(wèn)這些non-public的虛函數(shù),這是很容易做到的。
如:

class Base {
private: 
 virtual void f() { cout << "Base::f" << endl; } 
};

class Derive : public Base{ 
};
typedef void(*Fun)(void);
void main() {
 Derive d;
 Fun pFun = (Fun)*((int*)*(int*)(&d)+0);
 pFun(); 
}

對(duì)上面粗體部分的解釋(@a && x):

1. (int*)(&d)取vptr地址,該地址存儲(chǔ)的是指向vtbl的指針
2. (int*)*(int*)(&d)取vtbl地址,該地址存儲(chǔ)的是虛函數(shù)表數(shù)組
3. (Fun)*((int*)*(int*)(&d) +0),取vtbl數(shù)組的第一個(gè)元素,即Base中第一個(gè)虛函數(shù)f的地址
4. (Fun)*((int*)*(int*)(&d) +1),取vtbl數(shù)組的第二個(gè)元素(這第4點(diǎn),如下圖所示)。

下圖也能很清晰的說(shuō)明一些東西(@5):


ok,再來(lái)看一個(gè)問(wèn)題,如果一個(gè)子類重載的虛擬函數(shù)為privete,那么通過(guò)父類的指針可以訪問(wèn)到它嗎?

#include <IOSTREAM>   
class B   
{    
public:    
    virtual void fun()      
    {     
        std::cout << "base fun called";     
    };    
};  

class D : public B    
{    
private:   
    virtual void fun()      
    {     
        std::cout << "driver fun called";    
    };    
};  

int main(int argc, char* argv[])   
{       
    B* p = new D();    
    p->fun();    
    return 0;    
}  

運(yùn)行時(shí)會(huì)輸出 driver fun called

從這個(gè)實(shí)驗(yàn),可以更深入的了解虛擬函數(shù)編譯時(shí)的一些特征:
在編譯虛擬函數(shù)調(diào)用的時(shí)候,例如p->fun(); 只是按其靜態(tài)類型來(lái)處理的, 在這里p的類型就是B,不會(huì)考慮其實(shí)際指向的類型(動(dòng)態(tài)類型)。

    也就是說(shuō),碰到p->fun();編譯器就當(dāng)作調(diào)用B的fun來(lái)進(jìn)行相應(yīng)的檢查和處理。
因?yàn)樵贐里fun是public的,所以這里在“訪問(wèn)控制檢查”這一關(guān)就完全可以通過(guò)了。
然后就會(huì)轉(zhuǎn)換成(*p->vptr[1])(p)這樣的方式處理, p實(shí)際指向的動(dòng)態(tài)類型是D,
    所以p作為參數(shù)傳給fun后(類的非靜態(tài)成員函數(shù)都會(huì)編譯加一個(gè)指針參數(shù),指向調(diào)用該函數(shù)的對(duì)象,我們平常用的this就是該指針的值), 實(shí)際運(yùn)行時(shí)p->vptr[1]則獲取到的是D::fun()的地址,也就調(diào)用了該函數(shù), 這也就是動(dòng)態(tài)運(yùn)行的機(jī)理。


為了進(jìn)一步的實(shí)驗(yàn),可以將B里的fun改為private的,D里的改為public的,則編譯就會(huì)出錯(cuò)。
C++的注意條款中有一條" 絕不重新定義繼承而來(lái)的缺省參數(shù)值" 
(Effective C++ Item37, never redefine a function's inherited default parameter value) 也是同樣的道理。

可以再做個(gè)實(shí)驗(yàn)
class B   
{    
public:   
    virtual void fun(int i = 1)      
    {     
        std::cout << "base fun called, " << i;     
    };    
};  

class D : public B    
{    
private:    
    virtual void fun(int i = 2)      
    {     
        std::cout << "driver fun called, " << i;     
    };    
}; 

 

 

則運(yùn)行會(huì)輸出driver fun called, 1

 

關(guān)于這一點(diǎn),Effective上講的很清楚“virtual 函數(shù)系動(dòng)態(tài)綁定, 而缺省參數(shù)卻是靜態(tài)綁定”,
也就是說(shuō)在編譯的時(shí)候已經(jīng)按照p的靜態(tài)類型處理其默認(rèn)參數(shù)了,轉(zhuǎn)換成了(*p->vptr[1])(p, 1)這樣的方式。
 

補(bǔ)遺

   一個(gè)類如果有虛函數(shù),不管是幾個(gè)虛函數(shù),都會(huì)為這個(gè)類聲明一個(gè)虛函數(shù)表,這個(gè)虛表是一個(gè)含有虛函數(shù)的類的,不是說(shuō)是類對(duì)象的。一個(gè)含有虛函數(shù)的類,不管有多少個(gè)數(shù)據(jù)成員,每個(gè)對(duì)象實(shí)例都有一個(gè)虛指針,在內(nèi)存中,存放每個(gè)類對(duì)象的內(nèi)存區(qū),在內(nèi)存區(qū)的頭部都是先存放這個(gè)指針變量的(準(zhǔn)確的說(shuō),應(yīng)該是:視編譯器具體情況而定),從第n(n視實(shí)際情況而定)個(gè)字節(jié)才是這個(gè)對(duì)象自己的東西。

 

下面再說(shuō)下通過(guò)基類指針,調(diào)用虛函數(shù)所發(fā)生的一切:
One *p;
p->disp();

1、上來(lái)要取得類的虛表的指針,就是要得到,虛表的地址。存放類對(duì)象的內(nèi)存區(qū)的前四個(gè)字節(jié)其實(shí)就是用來(lái)存放虛表的地址的。
2、得到虛表的地址后,從虛表那知道你調(diào)用的那個(gè)函數(shù)的入口地址。根據(jù)虛表提供的你要找的函數(shù)的地址。并調(diào)用函數(shù);你要知道,那個(gè)虛表是一個(gè)存放指針變量的數(shù)組,并不是說(shuō),那個(gè)虛表中就是存放的虛函數(shù)的實(shí)體。

本章完。



青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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 | 最新日韩精品| 欧美3dxxxxhd| 亚洲女同同性videoxma| 亚洲一区二区四区| 免费亚洲网站| 亚洲电影有码| 午夜在线播放视频欧美| 亚洲国产成人在线视频| 国产伦精品一区二区三区| 久久综合中文| 欧美日本网站| 久热精品视频在线观看| 久久亚洲精品一区二区| 午夜久久久久久久久久一区二区| 欧美日韩亚洲激情| 国产精品老女人精品视频| 亚洲人成77777在线观看网| 亚洲精品视频啊美女在线直播| 久久国产乱子精品免费女 | 欧美在线看片a免费观看| 欧美一区二区黄色| 一区二区三区四区五区视频| 亚洲欧美资源在线| 一本久久综合| 美女精品在线观看| 亚洲电影自拍| 欧美黄色网络| 日韩一级成人av| 99国产精品| 久久久久国产精品一区| 欧美在线影院在线视频| 免费亚洲网站| 亚洲小视频在线| 亚洲一区国产一区| 欧美成人视屏| 欧美激情一区二区三区成人| 国产九区一区在线| 国产精品影音先锋| 亚洲国产精品久久久久久女王 | 欧美午夜无遮挡| 亚洲二区视频| 亚洲电影毛片| 欧美成人午夜77777| 六月婷婷久久| av成人毛片| 久久久久久久久蜜桃| 久久久久国产一区二区三区四区| 欧美日韩亚洲一区二区三区| 国产精品免费久久久久久| 亚洲精品1区| 亚洲精选在线观看| 蜜臀av国产精品久久久久| 欧美刺激性大交免费视频| 亚洲第一页自拍| 亚洲精品欧美一区二区三区| 午夜精品一区二区三区在线播放 | 一本不卡影院| 免费日韩视频| 99xxxx成人网| 欧美日韩亚洲另类| 国产精品超碰97尤物18| 亚洲精品偷拍| 欧美在线影院| 亚洲一区二区三区四区五区黄| 亚洲摸下面视频| 久久夜色精品一区| 午夜在线a亚洲v天堂网2018| 久久九九全国免费精品观看| 国产日韩欧美在线播放不卡| 亚洲精品一区在线观看香蕉| 亚洲国产cao| 亚洲伊人一本大道中文字幕| 欧美日韩三级视频| 国产精品一区=区| 午夜精品在线视频| 亚洲国产精品女人久久久| 快播亚洲色图| 国产情侣一区| 久久久噜久噜久久综合| 亚洲毛片av在线| 亚洲靠逼com| 欧美大片在线观看一区| 蜜臀av性久久久久蜜臀aⅴ四虎 | 欧美岛国激情| 一区二区三区高清在线| 日韩视频中文| 日韩一级免费观看| 久久综合给合久久狠狠狠97色69| 在线观看一区视频| 亚洲永久在线观看| 欧美一区三区二区在线观看| 国产视频久久网| 影音先锋一区| 精品成人国产| 国产亚洲永久域名| 欧美成在线观看| 亚洲欧美偷拍卡通变态| 欧美日韩专区在线| 一本大道久久a久久综合婷婷| 欧美福利精品| 免费观看日韩av| 永久免费精品影视网站| 久久九九免费视频| 欧美激情精品久久久| 亚洲国产另类精品专区| 亚洲人妖在线| 欧美精品在线免费播放| 性色av香蕉一区二区| 亚洲欧美久久| 另类激情亚洲| 亚洲精品孕妇| 欧美在线视频一区| 国产主播一区| 久久精品综合一区| 久久精品国产一区二区三| 一区二区三区自拍| 久热精品视频在线观看一区| 久久午夜精品一区二区| 亚洲国产精品va| 日韩一级成人av| 女同性一区二区三区人了人一| 国产伦精品一区二区三区免费| 韩日精品在线| 亚洲免费观看高清完整版在线观看熊| 欧美精品一区二区三区久久久竹菊| 一区二区日韩伦理片| 久久国产精品久久w女人spa| 在线成人免费视频| 亚洲欧美在线免费观看| 黑丝一区二区| 亚洲欧美日韩爽爽影院| 国外视频精品毛片| 午夜伦理片一区| 亚洲高清色综合| 欧美在线播放一区| 亚洲精品综合在线| 麻豆视频一区二区| 亚洲视频www| 欧美日韩高清一区| 午夜影院日韩| 国产婷婷色一区二区三区四区 | 国产精品久久久久三级| 久久精品中文字幕一区二区三区| 国产精品国产福利国产秒拍| 久久午夜精品| 精品动漫3d一区二区三区| 亚洲精品免费一区二区三区| 亚洲日本成人| 先锋资源久久| 久久久久一区| 国产精品豆花视频| 亚洲女人天堂成人av在线| 亚洲精品久久嫩草网站秘色| 美女任你摸久久| 激情另类综合| 久久天天躁狠狠躁夜夜av| 亚洲午夜激情网站| 欧美日韩中文字幕综合视频| 久久亚洲捆绑美女| 亚洲人成7777| 欧美一级专区| 久久在线精品| 国产精品mm| 在线视频日韩| 国产精品亚洲激情| 亚洲视频在线观看免费| 亚洲精品1区| 欧美视频你懂的| 欧美激情中文字幕一区二区| 亚洲电影自拍| 亚洲欧美另类在线观看| 国产欧美三级| 久久青草欧美一区二区三区| 国一区二区在线观看| 久久一区二区精品| 精品不卡视频| 亚洲精品偷拍| 一区二区三区四区五区精品视频| 久久网站热最新地址| 樱桃视频在线观看一区| 欧美一级欧美一级在线播放| 国产精品白丝jk黑袜喷水| 精品51国产黑色丝袜高跟鞋| 欧美激情五月| 久久久999| 亚洲精品在线免费观看视频| 亚洲美女视频网| 久久久水蜜桃| 欧美色视频一区| 亚洲一区二区三区精品在线观看| 久久99伊人| 国内外成人免费视频| 欧美在线观看一区二区| 久久午夜激情| 亚洲精品1234| 国产精品成人国产乱一区| 欧美成人自拍视频| 日韩视频在线观看免费| 欧美亚洲综合在线|