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

zhuweisky

思考、探索、實(shí)踐...... Rumination on C++
posts - 2, comments - 22, trackbacks - 0, articles - 0
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

我們把一個(gè)僅僅含有純虛函數(shù)的類稱為接口,我們也好像已經(jīng)習(xí)慣了將這個(gè)接口中的所有純虛函數(shù)全聲明為public,而且按照這樣的設(shè)計(jì),一切都工作得不錯(cuò)。比如COM正是這樣做的,它的接口中幾乎不會(huì)存在private的純虛函數(shù)。那么,讓我們想一想,純虛函數(shù)或者虛函數(shù)可以為private嗎?如果這種方式是可行的,那么什么時(shí)候可以將(純)虛函數(shù)設(shè)為private了?這些都是本文將要討論的主題。一起來(lái)看看。


一.訪問(wèn)限定符與繼承
  
 

如果基類隱式(間接)向子類暴露了私有成員,那么從某種意義上講,該私有成員對(duì)于子類是可見(jiàn)的。

任何一本講C++基礎(chǔ)的課本上都詳細(xì)地介紹了訪問(wèn)限定符與繼承的關(guān)系,在這里就不重復(fù)了,但是,課本上的東西并不全,不信?那么請(qǐng)先看看下面的例子:

#include <string>  
#include 
<iostream>
 
using namespace
 std ; 

class
 Base 

private

    
string classID() const

    { 
       
return string("Base") ; 
    } 

protected

    
virtual void doWork() =0 ; //純虛函數(shù)


public:  
    
void
 work() 
    { 
        cout
<<"this class id is "<<classID()<<
endl ;  
        doWork() ; 
    } 

    
virtual ~
Base() 
    { 
    } 
}; 

class DerivedA : public
 Base 

private

    
string classID() const
  
    { 
       
return string("DerivedA"
) ;
    } 

protected

    
void
 doWork() 
    { 

       cout
<<"this is DerivedA doWork !"<<
endl ; 
    } 
};

    以上的代碼聲明了一個(gè)基類和一個(gè)子類,不過(guò)比較奇特的是基類的提供的公共接口是非虛的,而這個(gè)非虛的公共接口卻調(diào)用了一個(gè)非虛的私有函數(shù)和一個(gè)虛擬的保護(hù)函數(shù)。接著,子類重定義了這兩個(gè)函數(shù)。那么下面的調(diào)用會(huì)輸出什么了?   

Base* bp = new DerivedA() ; 
bp
->work() ;  
delete bp ; 

   以下是輸出的結(jié)果:
   this class id is Base 
   this is DerivedA doWork ! 

   怎么回事?為什么不是
 
      this class id is DerivedA 
      this is DerivedA doWork !

子類的classID()不是將基類的classID()覆蓋了么?我們來(lái)分析一下,基類中的公共的work()成員函數(shù)調(diào)用了私有的classID()成員函數(shù),根據(jù)輸出的結(jié)果來(lái)看,在子類中定義的classID方法并沒(méi)有覆蓋基類的同名方法,為什么呢?難道是因?yàn)?/SPAN>classIDprivate導(dǎo)致的?那好,我們將classID函數(shù)改為public再次運(yùn)行,我們期望的結(jié)果出現(xiàn)了嗎?呵呵,很抱歉,沒(méi)有,希望再次破滅了,為什么會(huì)這樣?這主要涉及的原因是:普通函數(shù)的調(diào)用是在編譯期確定的,當(dāng)work函數(shù)一看到所調(diào)用的classID是非虛的,就會(huì)毫無(wú)疑問(wèn)地去直接使用基類的classID。這一切與Base類是否會(huì)被繼承沒(méi)有任何關(guān)系,跟Base類被繼承后子類會(huì)否再次定義classID就更沒(méi)有關(guān)系了。

   那么這種情況下,
Base類將classID聲明為privatepublic/protected有什么區(qū)別了?當(dāng)將classID聲明為private時(shí),DerivedA看不到基類的classID的聲明,所以不會(huì)發(fā)生重定義;當(dāng)將classID聲明為public/protected時(shí),DerivedA將看到基類的classID聲明,于是會(huì)發(fā)生重定義,即會(huì)覆蓋調(diào)基類的classID的定義。講到這里就要提一下,如果當(dāng)將classID聲明為public/protected,并且子類也定義同名的函數(shù)classID,但是子類的classID與基類的classID的函數(shù)簽名不同,那么此時(shí)發(fā)生的將是函數(shù)重載而不是覆蓋。

讓我們更進(jìn)一步,將基類和子類的classID聲明都改為virtual public ,再次運(yùn)行程序,會(huì)得到以下輸出: 
         this class id is DerivedA 
         this is DerivedA doWork !

而這正是我們所期望的,不是嗎?這其中的原因也很容易理解,因?yàn)?/SPAN>classIDvirtual ,并且是public的,所以會(huì)產(chǎn)生多態(tài)調(diào)用。
   
再往下走,將基類和子類的classID聲明改為virtual private ,再次運(yùn)行程序,看看輸出了什么。
      this class id is DerivedA 
      this is DerivedA doWork !

沒(méi)有變化,將classID聲明為virtual private和聲明為 virtual public 得到的結(jié)果是一樣的。“為什么會(huì)這樣,classIDprivate啊?”你驚訝地叫出來(lái)。是,classIDprivate,但classID也是virtual,原因就在這里,用基類指針或引用進(jìn)行虛函數(shù)調(diào)用采用的是動(dòng)態(tài)綁定,看看編譯器為調(diào)用classID產(chǎn)生的代碼就知道了:

//c++偽碼

(this->vptr[1])() ;

在運(yùn)行時(shí)期,通過(guò)this指針將會(huì)找到正確的vtbl,即DerivedA類的vtbl,這樣自然就會(huì)出現(xiàn)上面的結(jié)果了。那么將classID 聲明為private限制了什么?和將非虛函數(shù)聲明為private一樣,這將使得在Base類外部無(wú)法調(diào)用多態(tài)函數(shù)classID,只能在Base內(nèi)部調(diào)用,如通過(guò)work函數(shù)調(diào)用。

   可見(jiàn),多態(tài)性與將實(shí)現(xiàn)多態(tài)的函數(shù)的訪問(wèn)限定符沒(méi)有任何關(guān)系,private 函數(shù)仍然可以實(shí)現(xiàn)多態(tài),它的指針仍然位于vtbl中,只不過(guò)該函數(shù)的多態(tài)一般只能在基類的內(nèi)部由其他非虛函數(shù)調(diào)用該函數(shù)的時(shí)候反映出來(lái),訪問(wèn)限定符僅僅限制外部對(duì)類的成員的訪問(wèn)權(quán)限,它并沒(méi)有破壞以下規(guī)則: 

       
通過(guò)基類指針或引用調(diào)用成員函數(shù)時(shí),如果該函數(shù)時(shí)非虛的,那么將采用靜態(tài)綁定,即編譯時(shí)綁定;如果該函數(shù)是虛擬的,則采用動(dòng)態(tài)綁定,即運(yùn)行時(shí)綁定。

二.virtual與訪問(wèn)限定符結(jié)合

上面我們通過(guò)分析,已經(jīng)知道了多態(tài)的實(shí)現(xiàn)與訪問(wèn)限定符沒(méi)有任何關(guān)系,訪問(wèn)限定符只是控制類的成員對(duì)外部的可見(jiàn)性,但不限制多態(tài)。正如上面提到的,將classID聲明為virtual private和聲明為 virtual public 后再次運(yùn)行程序,得到的結(jié)果是一樣的,上面我們簡(jiǎn)單的地分析了一下表面現(xiàn)象,但這個(gè)問(wèn)題決不是這么簡(jiǎn)單,讓我們挖掘更深層次的意義,我想這應(yīng)該屬于OOAOOD的范疇了。好,讓我們一步步看過(guò)來(lái)。

當(dāng)我們將classID聲明為非虛的 private時(shí),子類將看不見(jiàn)它,當(dāng)然也就無(wú)法覆蓋或重載它,即在這中情況下,子類無(wú)法更改classID的實(shí)現(xiàn),但是子類繼承了公共接口work(),而這個(gè)接口調(diào)用了classID,所以,可以看作,子類間接地繼承了classID的實(shí)現(xiàn),并且這個(gè)實(shí)現(xiàn)是無(wú)法修改的。于是,我可以說(shuō),基類中聲明一個(gè)普通私有成員函數(shù),表示這是一個(gè)不可被更改的實(shí)現(xiàn)細(xì)節(jié)。

再來(lái)討論將classID聲明為virtual private的情況,聲明為private表示基類不想讓子類看到這個(gè)函數(shù),但是又聲明為virtual,表示基類想讓這個(gè)函數(shù)實(shí)現(xiàn)多態(tài)。呵呵,基類既想實(shí)現(xiàn)多態(tài),卻又不讓子類看見(jiàn)這個(gè)函數(shù),這似乎有點(diǎn)自相矛盾,是嗎?其實(shí),這其中的意思是,子類既可以修改這個(gè)實(shí)現(xiàn),也可以繼承其基類默認(rèn)的實(shí)現(xiàn)。所以可以這么說(shuō),如果基類中有一個(gè)虛擬私有成員函數(shù),表示這是一個(gè)“可以”被派生類修改的實(shí)現(xiàn)細(xì)節(jié)。注意,當(dāng)中的用詞,是“可以”,而不是別的。

最后來(lái)看看將classID聲明為virtual protected的情況。將classID聲明為protected表示基類“需要”子類看見(jiàn)這個(gè)函數(shù),注意,我使用“需要”這個(gè)動(dòng)詞,這個(gè)詞表示了一定的“強(qiáng)制”意味。與將classID聲明為virtual private的情況對(duì)比一下,我想你已經(jīng)知道答案了,即是,如果基類中有一個(gè)虛擬保護(hù)成員函數(shù),表示這是一個(gè)必須被派生類修改的實(shí)現(xiàn)細(xì)節(jié)。“必須”這個(gè)詞表達(dá)了強(qiáng)制的意思。

關(guān)于“virtual與訪問(wèn)限定符結(jié)合”的問(wèn)題就討論這么多,你也許說(shuō),還漏掉了將classID聲明為virtual public的情況。是的,其實(shí),我并不推薦將虛擬函數(shù)聲明為public,盡管這種方式在現(xiàn)在很流行,我推薦將其使用virtual protected來(lái)替換,這就說(shuō)明基類必須另外發(fā)布一個(gè)幾乎不更改的非虛public接口,在這個(gè)接口中調(diào)用了virtual protectedvirtual private函數(shù),這樣以來(lái),我們就對(duì)類的內(nèi)部實(shí)現(xiàn)作了進(jìn)一步的隱藏,而這無(wú)論是對(duì)系統(tǒng)的可擴(kuò)展性,還是可維護(hù)性都是大有幫助的。“虛擬函數(shù)應(yīng)該和數(shù)據(jù)成員一樣對(duì)待――讓他們成為私有的,除非設(shè)計(jì)需求表明應(yīng)該有較少的限制。提升它們到更高存取級(jí)別比把它們降到更私有的級(jí)別更容易些。”

最后,把上面所說(shuō)的小結(jié)一下:

      基類中的一個(gè)普通私有成員函數(shù),表示這是一個(gè)不可被更改的實(shí)現(xiàn)細(xì)節(jié)。 
      基類中的一個(gè)虛擬私有成員函數(shù),表示這是一個(gè)可以被派生類修改的實(shí)現(xiàn)細(xì)節(jié)。
      基類中的一個(gè)虛擬保護(hù)成員函數(shù),表示這是一個(gè)必須被派生類修改的實(shí)現(xiàn)細(xì)節(jié)。 
   
   最好不要將虛擬成員函數(shù)聲明為public,而是用protected來(lái)替換。

三.模板方法模式

在理解了上面所述的內(nèi)容的情況下,再來(lái)理解模板方法模式就非常easy了,模板方法是在GOF的經(jīng)典大作《設(shè)計(jì)模式》中闡述了一種模式,該模式定義了一個(gè)操作中的算法的骨架,而將一些步驟的實(shí)現(xiàn)延遲到子類中,模板方法使得派生類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義算法的某些特定步驟。在這里,我不想再重復(fù)解釋這個(gè)模式如何實(shí)現(xiàn)的,我僅僅舉個(gè)例子,這個(gè)例子將體現(xiàn)出模板方法中最重要的思想。

假設(shè)基類定義的一個(gè)算法的骨架由3個(gè)步驟完成,其中第一個(gè)步驟是該繼承體系中不可被改變的一個(gè)步驟,即所有的類對(duì)該步驟的實(shí)現(xiàn)都是一樣的,那個(gè)這個(gè)步驟可以設(shè)置為非虛的private ;第二個(gè)步驟是一個(gè)可以被派生類改寫(xiě)也可以不被改寫(xiě)的步驟,通過(guò)上面的討論知道,可以將其設(shè)為virtual private ;第三個(gè)步驟是針對(duì)每一個(gè)派生類的實(shí)現(xiàn)都不同,那么這個(gè)步驟可以被設(shè)為virtual protected ,而且,步驟三只能針對(duì)特定的派生類才有意義,所以將步驟三也設(shè)為純虛函數(shù)。如下面的代碼所示:

 

class BaseTemplate 

private


    
void step1(void)  // 不可被更改的實(shí)現(xiàn)細(xì)節(jié) 

    { 
         
    } 
    
virtual void step2(void ) // 可以被派生類修改的實(shí)現(xiàn)細(xì)節(jié) 

    { 
         
    } 

protected

    
virtual void step3(void ) =0// 必須被派生類修改的實(shí)現(xiàn)細(xì)節(jié)     


public
    
void work(void// 骨架函數(shù),實(shí)現(xiàn)了骨架 

    { 
       step1() ; 
       step2() ; 
       step3() ;     
    } 
};    


   注意,上例中根本沒(méi)有暴露任何虛函數(shù),所有的這一切都是通過(guò)work()這個(gè)非虛的public接口展現(xiàn)出來(lái)的,當(dāng)我們用一個(gè)BaseTemplate指針調(diào)用work()時(shí),表面上是一個(gè)非虛函數(shù)調(diào)用,采用靜態(tài)綁定,事實(shí)上也正是這樣,但是,這個(gè)調(diào)用的背后隱藏的卻是多態(tài)調(diào)用,即step2step3動(dòng)態(tài)綁定了。看見(jiàn),采用模板方法模式,不僅定義了一個(gè)算法的骨架,而且把這個(gè)骨架的實(shí)現(xiàn)的細(xì)節(jié)作了進(jìn)一步的封裝。我們可以在模板方法模式中可以這樣設(shè)計(jì):

(1)       如果一個(gè)函數(shù)作為算法骨架中不可變更的一部分,那么可以將此函數(shù)作為基類的私有函數(shù),并且在基類的公共骨架函數(shù)中調(diào)用該函數(shù),即該函數(shù)作為骨架的一個(gè)不可更改的實(shí)現(xiàn)細(xì)節(jié)。

(2)       如果一個(gè)函數(shù)提供了算法骨架某環(huán)節(jié)的一個(gè)缺省實(shí)現(xiàn),那么可以考慮將該函數(shù)作為基類的私有虛函數(shù),表示子類可以改寫(xiě)它,也可以不改寫(xiě)它。

(3)       如果作為算法骨架一部分某個(gè)函數(shù)要求在子類中擁有不同的實(shí)現(xiàn),那么可以考慮將該函數(shù)作為基類的保護(hù)(純)虛函數(shù),表示子類必須改寫(xiě)它。

講到這里,已經(jīng)差不多了,在結(jié)束的時(shí)候,提一下語(yǔ)法與語(yǔ)義的聯(lián)系。通常,語(yǔ)法是表象,語(yǔ)義是表象后面隱藏的東西,而這些隱藏的語(yǔ)義往往更具有價(jià)值。舉個(gè)例子,public繼承與private繼承在語(yǔ)法方面似乎沒(méi)有什么更多的東西值得探討,它們的區(qū)別僅僅在于改變了繼承得到的成員的可見(jiàn)性,但是從語(yǔ)義方面來(lái)分析,它們就相差太遠(yuǎn)了,private繼承在語(yǔ)義上來(lái)講是“通過(guò)基類來(lái)實(shí)現(xiàn)自己”,即是“實(shí)現(xiàn)繼承”,在這種繼承關(guān)系中,基類和子類的關(guān)系是很薄弱的;而public繼承在語(yǔ)義上即是我們所熟知的“IS-A”關(guān)系,它體現(xiàn)了基類和子類之間的親密性,也正是這種“IS-A”關(guān)系為多態(tài)性提供了基礎(chǔ)。

所以,通過(guò)表面的語(yǔ)法來(lái)挖掘其背后的語(yǔ)義很有意義,就像這篇文章中提到的將訪問(wèn)限定符與virtual結(jié)合起來(lái)的語(yǔ)法背后隱藏的語(yǔ)義,挖掘出這些語(yǔ)義,對(duì)于我們以后在進(jìn)行設(shè)計(jì)時(shí)作恰當(dāng)?shù)木駬駸o(wú)疑是大有幫助的。


--zhuweisky 2003.04.18

Feedback

# re: 純虛函數(shù)能為private嗎?  回復(fù)  更多評(píng)論   

2006-04-16 13:32 by lkhg
hk,nnb,nb,khgdfmgsdkkopx,cv flkgbp[fdl p[lgp[dlfp[dsgfsdgbvs

# re: 純虛函數(shù)能為private嗎?  回復(fù)  更多評(píng)論   

2006-04-16 18:51 by ZiDing
嗯,不錯(cuò)不錯(cuò)。

# re: 純虛函數(shù)能為private嗎?  回復(fù)  更多評(píng)論   

2006-04-17 17:48 by 千里馬肝
LZ的論點(diǎn)即是《Exceptional C++ Style中文版》的第17、18、19節(jié) 的進(jìn)一步描述

# re: 純虛函數(shù)能為private嗎?  回復(fù)  更多評(píng)論   

2006-05-02 21:51 by 田地
關(guān)于“基類中的一個(gè)虛擬保護(hù)成員函數(shù)”,protected表示基類“需要”子類看見(jiàn)這個(gè)函數(shù),也就是派生類的其他函數(shù)可以調(diào)用這個(gè)虛擬函數(shù)吧?派生類可以修改也可以不修改吧?如果是必須修改,只能依靠聲明為純虛函數(shù)來(lái)“強(qiáng)制”吧?

# re: 純虛函數(shù)能為private嗎?  回復(fù)  更多評(píng)論   

2006-10-12 09:43 by dxt
受用,不錯(cuò)

# re: 純虛函數(shù)能為private嗎?  回復(fù)  更多評(píng)論   

2006-11-04 14:24 by mumutou
我覺(jué)得他說(shuō)的不對(duì),
class BaseTemplate
{
private:

void step1(void) // 不可被更改的實(shí)現(xiàn)細(xì)節(jié)
{

}
virtual void step2(void ) // 可以被派生類修改的實(shí)現(xiàn)細(xì)節(jié)
{

}

protected:
virtual void step3(void ) =0; // 必須被派生類修改的實(shí)現(xiàn)細(xì)節(jié)

public:
void work(void) // 骨架函數(shù),實(shí)現(xiàn)了骨架
{
step1() ;
step2() ;
step3() ;
}
};
protected:
virtual void step3(void ) =0; // 必須被派生類修改的實(shí)現(xiàn)細(xì)節(jié)
這是一個(gè)pure virtual 函數(shù),當(dāng)然必須被派生類修改了,不然怎么用

# re: 純虛函數(shù)能為private嗎?  回復(fù)  更多評(píng)論   

2006-11-04 14:32 by mumutou
#include <string>
#include <iostream>
using namespace std ;

class Base
{
protected:
virtual string classID() const
{
return string("Base") ;
}

protected:
virtual void doWork() =0 ; //純虛函數(shù)

public:
void work()
{
cout<<"this class id is "<<classID()<<endl ;
doWork() ;
}

virtual ~Base()
{
}
};

class DerivedA : public Base
{
protected:
void doWork()
{

cout<<"this is DerivedA doWork !"<<endl ;
}
};


void main(int argc, char* argv[])
{
DerivedA* bp = new DerivedA() ;
bp->work() ;
delete bp ;
}
基類中的一個(gè)虛擬保護(hù)成員函數(shù),表示這是一個(gè)必須被派生類修改的實(shí)現(xiàn)細(xì)節(jié)。
不然的話,調(diào)用的還是Base 的classID
這樣理解就對(duì)了

# re: 純虛函數(shù)能為private嗎?  回復(fù)  更多評(píng)論   

2006-12-17 21:59 by 天吻
很受用.頂啊!!!

# re: 純虛函數(shù)能為private嗎?  回復(fù)  更多評(píng)論   

2007-01-17 15:33 by 黃劍雄
"講到這里就要提一下,如果當(dāng)將classID聲明為public/protected,并且子類也定義同名的函數(shù)classID,但是子類的classID與基類的classID的函數(shù)簽名不同,那么此時(shí)發(fā)生的將是函數(shù)重載而不是覆蓋。"

這句話是什么意思?為什么是重載,派生類的函數(shù)能重載基類的函數(shù)??
重載是對(duì)同一個(gè)類域的不同函數(shù)來(lái)說(shuō)吧

# re: 純虛函數(shù)能為private嗎?  回復(fù)  更多評(píng)論   

2007-02-01 11:29 by zhaoflying
@黃劍雄
樓主寫(xiě)錯(cuò)了,不是重載,而是隱藏。事實(shí)上子類會(huì)把基類中的這個(gè)同名函數(shù)給隱藏掉,試圖通過(guò)子類對(duì)象來(lái)調(diào)用基類的classID()會(huì)報(bào)編譯錯(cuò)誤,但可以通過(guò)子類對(duì)象調(diào)用自己的classID()。所以這種做法是不合適的。

# re: 純虛函數(shù)能為private嗎?  回復(fù)  更多評(píng)論   

2007-07-14 16:05 by juv
樓主內(nèi)容相當(dāng)精彩,但是呢,如同樓上所說(shuō):不是覆蓋和重載,是隱藏!

還有:
基類中的一個(gè)虛擬私有成員函數(shù),表示這是一個(gè)可以被派生類修改的實(shí)現(xiàn)細(xì)節(jié)。
基類中的一個(gè)虛擬保護(hù)成員函數(shù),表示這是一個(gè)必須被派生類修改的實(shí)現(xiàn)細(xì)節(jié)。


不敢茍同!建議樓主看EFFETIVE C++ 第三版條款34!

# re: 純虛函數(shù)能為private嗎?  回復(fù)  更多評(píng)論   

2007-09-20 18:04 by asd
派生類public繼承時(shí),基類成員函數(shù)private還是public沒(méi)有區(qū)別,摟主混淆概念了!

# re: 純虛函數(shù)能為private嗎?  回復(fù)  更多評(píng)論   

2007-12-01 22:11 by gules
virtual函數(shù)的訪問(wèn)控制級(jí)別具有隱含的意義:一個(gè)protected virtual function告訴你:“你寫(xiě)的派生類應(yīng)該,可是說(shuō)是必須調(diào)用我(基類)的實(shí)現(xiàn)。”而一個(gè)private virtual function是在說(shuō):“派生類可以覆蓋,也可以不覆蓋我,隨你的便。但是你不可以調(diào)用我的實(shí)現(xiàn)。”

# re: 純虛函數(shù)能為private嗎?  回復(fù)  更多評(píng)論   

2011-03-14 16:45 by suantou
強(qiáng)人啊 膜拜一下 好文章

# re: 純虛函數(shù)能為private嗎?  回復(fù)  更多評(píng)論   

2011-10-08 18:41 by www
第一段示例代碼并不怎么樣,顯然偏離主旨,一個(gè)classID()顯然不是虛函數(shù)

比較:
以下是輸出的結(jié)果:
this class id is Base
this is DerivedA doWork !

怎么回事?為什么不是
this class id is DerivedA
this is DerivedA doWork !

區(qū)別只在于Base 和DerivedA ,沒(méi)能說(shuō)明什么,宜刪掉此部分。

# re: 純虛函數(shù)能為private嗎?[未登錄](méi)  回復(fù)  更多評(píng)論   

2011-12-30 20:57 by kevin
寫(xiě)得非常好啊,受益匪淺

# re: 純虛函數(shù)能為private嗎?  回復(fù)  更多評(píng)論   

2014-01-17 15:21 by 餓半肚
好吧,當(dāng)我沒(méi)看過(guò)。。忘記掉忘記掉。。。

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


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一站二站| 影音先锋在线一区| 午夜国产不卡在线观看视频| 欧美一区二区视频在线观看2020| av不卡在线看| 日韩视频三区| 99ri日韩精品视频| 亚洲午夜国产成人av电影男同| 亚洲国产精品v| 国内精品久久久久久久影视麻豆| 蜜桃伊人久久| 久久久国际精品| 欧美成人嫩草网站| 欧美激情一二区| 欧美三级黄美女| 国产伦精品一区二区| 国产毛片久久| 亚洲第一福利社区| 日韩一级免费| 亚洲欧美精品在线| 久久久综合激的五月天| 亚洲电影免费观看高清| 亚洲久久在线| 一区二区三区四区五区精品| 99热免费精品| 亚洲欧美日韩一区二区在线| 久久www免费人成看片高清| 久久久免费精品| 欧美激情中文不卡| 一本色道久久88综合亚洲精品ⅰ| 一本一道久久综合狠狠老精东影业| 亚洲社区在线观看| 久久久久女教师免费一区| 欧美—级高清免费播放| 国产精品一区三区| 亚洲日本一区二区| 欧美在线二区| 亚洲国产精品久久久久久女王| 亚洲精品一区二区三区樱花 | 亚洲欧美日本日韩| 久久一区激情| 国产乱肥老妇国产一区二| 亚洲精品一区二区三区蜜桃久| 性欧美精品高清| 亚洲黄色成人| 欧美在线观看视频一区二区三区| 女女同性精品视频| 国产视频一区在线观看一区免费| 亚洲精品一区二区三区四区高清 | 欧美精品成人在线| 久久在线视频在线| 欧美三级视频在线观看| 在线观看欧美精品| 欧美亚洲日本国产| 亚洲美女中文字幕| 免费不卡中文字幕视频| 国外视频精品毛片| 亚洲欧美在线免费| 日韩视频一区二区在线观看 | 美国十次了思思久久精品导航| 国产精品久久久久久久久久ktv | 亚洲在线视频| 欧美视频1区| 亚洲美女福利视频网站| 欧美二区在线观看| 久久人人爽人人爽爽久久| 国产在线精品自拍| 久久久xxx| 久久精品99久久香蕉国产色戒| 国产精品毛片大码女人| 亚洲影音一区| 在线一区二区三区四区五区| 欧美一区二区三区在线看| 国产精品日产欧美久久久久| 亚洲一区免费网站| 亚洲性人人天天夜夜摸| 国产精品国产精品| 午夜欧美精品久久久久久久| 9l视频自拍蝌蚪9l视频成人| 欧美另类女人| 亚洲一区高清| 亚洲综合国产| 狠狠网亚洲精品| 久久手机免费观看| 久久男人资源视频| 亚洲精品在线观| 日韩一区二区精品在线观看| 国产精品久久久久久久久久直播| 午夜国产精品影院在线观看| 亚洲欧美激情一区| 狠狠色伊人亚洲综合网站色| 欧美大片va欧美在线播放| 欧美成人性生活| 亚洲天堂男人| 午夜精品一区二区在线观看| 国内欧美视频一区二区| 欧美激情一区二区三区高清视频 | 亚洲精品综合久久中文字幕| 亚洲精品一区二区三区不| 久久成人人人人精品欧| 蜜臀91精品一区二区三区| 激情欧美一区二区| 欧美黄色aaaa| 欧美色123| 久久只有精品| 国产午夜精品美女视频明星a级| 亚洲欧美成人一区二区在线电影| 99精品久久久| 国产免费成人av| 老司机午夜精品视频在线观看| 久久综合久久综合这里只有精品| av成人福利| 欧美一区亚洲| 一本久道久久综合婷婷鲸鱼| 亚洲欧美日本日韩| 99这里只有久久精品视频| 午夜欧美大片免费观看| 亚洲精品一区二区三区在线观看 | 亚洲午夜电影| 亚洲丁香婷深爱综合| 一区二区三区欧美日韩| 亚洲第一天堂av| 亚洲一级黄色| 亚洲卡通欧美制服中文| 欧美专区日韩专区| 亚洲免费视频一区二区| 欧美成人综合网站| 快射av在线播放一区| 欧美午夜一区二区| 亚洲国产色一区| 尤物yw午夜国产精品视频| 中文欧美在线视频| 亚洲精选中文字幕| 免费视频一区| 免费在线看成人av| 国产午夜精品理论片a级大结局| 日韩一级大片在线| 亚洲精品一区二区三区不| 久久亚洲精品视频| 久久精品30| 国产农村妇女毛片精品久久莱园子| 亚洲激情在线视频| 91久久嫩草影院一区二区| 久久精品30| 久久久之久亚州精品露出| 国产性色一区二区| 先锋影音一区二区三区| 欧美一区午夜精品| 国产精品久久久久毛片软件 | 亚洲欧美日韩在线观看a三区 | 美女黄色成人网| 激情婷婷久久| 亚洲一区二区高清| 亚洲欧美日本日韩| 国产精品久久久一区二区| 一本色道久久综合亚洲精品不| 99re热这里只有精品视频| 亚洲夜间福利| 日韩亚洲精品视频| 欧美另类在线播放| 亚洲精品国久久99热| a4yy欧美一区二区三区| 欧美成人在线免费视频| 亚洲片在线观看| 一区二区三欧美| 欧美日韩在线亚洲一区蜜芽| av不卡在线| 欧美亚洲日本一区| 欧美日韩国产成人在线免费| 日韩亚洲欧美精品| 西西裸体人体做爰大胆久久久| 国产精品免费在线| 欧美一区二区在线看| 麻豆亚洲精品| 在线亚洲一区观看| 国产一二三精品| 欧美国产在线视频| 亚洲一区美女视频在线观看免费| 久久久五月婷婷| 在线亚洲国产精品网站| 国语精品中文字幕| 欧美日韩一二三四五区| 久久er精品视频| 亚洲美女中文字幕| 蜜桃久久av| 亚洲欧美成aⅴ人在线观看| 在线观看精品| 国产精品视频免费在线观看| 久久一区二区三区超碰国产精品| 亚洲日本国产| 久久亚洲欧美| 亚洲嫩草精品久久| 91久久香蕉国产日韩欧美9色| 国产精品美女在线| 欧美国产精品人人做人人爱| 欧美一级网站| 一区二区三区视频在线| 欧美成人资源| 久久精品成人一区二区三区蜜臀 | 欧美成人国产va精品日本一级|