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

隨筆 - 74, 文章 - 0, 評(píng)論 - 26, 引用 - 0
數(shù)據(jù)加載中……

C語(yǔ)言中的面向?qū)ο?/a>

一 、面向?qū)ο笏枷?br />


一、 面向?qū)ο笏枷氲哪康氖强蚣芑?,手段是抽?br />
相信很多人都明白面向?qū)ο笾v了什么:類,抽象類,繼承,多態(tài)。但是是什么原因促使這些概念的產(chǎn)生呢?

打個(gè)比方說:你去買顯示器,然而顯示器的品牌樣式是多種多樣的,你在買的過程中發(fā)生的事情也是不可預(yù)測(cè)的。對(duì)于這樣的事情,我們?cè)诔绦蛘Z(yǔ)言中如何去描述呢。面向?qū)ο蟮乃枷刖褪菫榱私鉀Q這樣的問題。編寫一個(gè)程序(甚至說是一個(gè)工程),從無(wú)到用是困難的,從有到豐富是更加困難的。面向?qū)ο髮⒊绦虻母鱾€(gè)行為化為對(duì)象,而又用抽象的辦法將這些對(duì)象歸類(抽象),從而將錯(cuò)綜復(fù)雜的事情簡(jiǎn)化為幾個(gè)主要的有機(jī)組合(框架化)。

其實(shí)我們的身邊很多東西都是這樣組成的:比如說電腦:電腦是由主板,CPU加上各種卡組成的。這就是一個(gè)框架化。而忽略不同的CPU,不同的主板,不同的聲卡,網(wǎng)卡,顯卡的區(qū)別,這就是抽象。再比如說現(xiàn)在的教育網(wǎng):是由主核心節(jié)點(diǎn):清華,北大,北郵等幾個(gè),然后是各個(gè)子節(jié)點(diǎn),依次組成了整個(gè)教育網(wǎng)網(wǎng)絡(luò)。

所以我覺得面向?qū)ο蟮木幊趟枷刖褪牵阂粋€(gè)大型工程是分層次結(jié)構(gòu)的,每層又由抽象的結(jié)構(gòu)連接為整體(框架化),各個(gè)抽象結(jié)構(gòu)之間是彼此獨(dú)立的,可以獨(dú)立進(jìn)化(繼承,多態(tài))。層次之間,結(jié)構(gòu)之間各有統(tǒng)一的通訊方式(通常是消息,事件機(jī)制)。

二、 以前 C 語(yǔ)言編程中常用的“面向?qū)ο蟆狈椒?br />
其實(shí)C語(yǔ)言誕生以來,人們就想了很多辦法來體現(xiàn)“面向?qū)ο蟆钡乃枷?。下面就來說說我所知道的方法。先說一些大家熟悉的東東,慢慢再講詭異的。呵呵

1. 宏定義:

有的人不禁要問,宏定義怎么扯到這里來了,我們可以先看一個(gè)簡(jiǎn)單的例子:

#define MacroFunction Afunction

然后在程序里面你調(diào)用了大量的AFunction,但是有一天,你突然發(fā)現(xiàn)你要用BFunction了,(不過AFunction又不能不要,很有可能你以后還要調(diào)用),這個(gè)時(shí)候,你就可以#define MacroFunction Bfunction來達(dá)到這樣的目的。

當(dāng)然,不得不說這樣的辦法是too simple,sometime na?ve的,因?yàn)橐粋€(gè)很滑稽的問題是如果我一般要改為BFunction,一半不變?cè)趺崔k? 那就只好查找替換了。

2. 靜態(tài)的入口函數(shù),保證函數(shù)名相同,利用標(biāo)志位調(diào)用子函數(shù):

這樣的典型應(yīng)用很多,比如說網(wǎng)卡驅(qū)動(dòng)里面有一個(gè)入口函數(shù)Nilan(int FunctionCode,Para*)。具體的參數(shù)是什么記不清楚了。不過NiLan的主體是這樣的:

Long Nilan(int FunctionCode,Para*){

Switch(FunctionCode){

Case SendPacket: send(….)

Case ReceivePacket: receive(…)

…..

}

寫到這里大家明白什么意思了吧。保證相同的函數(shù)名就是說:網(wǎng)卡驅(qū)動(dòng)是和pNA+協(xié)議棧互連的,那么如何保證pNA+協(xié)議棧和不同的驅(qū)動(dòng)都兼容呢,一個(gè)簡(jiǎn)單的辦法就是僅僅使用一個(gè)入口函數(shù)。通過改變?nèi)绻瘮?shù)的參數(shù)值,來調(diào)用內(nèi)部的各個(gè)函數(shù)。這樣的做法是可以進(jìn)化的:如果以后想調(diào)用新的函數(shù),增加相應(yīng)的函數(shù)參數(shù)值就好了。如果我們將網(wǎng)卡驅(qū)動(dòng)和pNA+協(xié)議??醋鲀蓚€(gè)層的話,我們可以發(fā)現(xiàn):

層與層之間的互連接口是很小的(這里是一個(gè)入口函數(shù)),一般是采用名字解析的辦法而不是具體的函數(shù)調(diào)用(利用FunctionCode調(diào)用函數(shù),Nilan僅僅實(shí)現(xiàn)名字解析的功能) ――!接口限制和名字解析

接口限制:層與層之間僅僅知道有限的函數(shù)

名字解析:層與層之間建立共同的名字與函數(shù)的對(duì)應(yīng)關(guān)系,之間利用名字調(diào)用功能。

3.CALLBACK函數(shù)。

我覺得這是C語(yǔ)言的一個(gè)創(chuàng)舉,雖然它很簡(jiǎn)單,就象如何把雞蛋豎起來一樣,但是你如果沒想到的話,嘿嘿。如果說靜態(tài)入口函數(shù)實(shí)現(xiàn)了一個(gè)可管理的宏觀的話,CallBack就是實(shí)現(xiàn)了一個(gè)可進(jìn)化的微觀:它使得一個(gè)函數(shù)可以在不重新編譯的情況下實(shí)現(xiàn)功能的添加!但是在最最早期的時(shí)候,也有蠻多人持反對(duì)態(tài)度,因?yàn)樗昧撕瘮?shù)指針。函數(shù)指針雖然靈活,但是由于它要訪問內(nèi)存兩次才可以調(diào)用到函數(shù),第一次訪問函數(shù)指針,第二次才是真正的函數(shù)調(diào)用。它的效率是不如普通函數(shù)的。但是在一個(gè)不太苛刻的環(huán)境下,函數(shù)調(diào)用本身就不怎么耗時(shí),函數(shù)指針的性能又不是特別糟糕,使用函數(shù)指針其實(shí)是一個(gè)最好的選擇。但是函數(shù)指針除了性能,最麻煩的地方就是會(huì)導(dǎo)致程序的“支離破碎”。試想:在程序中,你讀到一個(gè)函數(shù)指針的時(shí)候,如果你愣是不知道這個(gè)函數(shù)指針指向的是哪個(gè)函數(shù),那個(gè)感覺真的很糟糕。(可以看后面的文章,要使用先進(jìn)的程序框架,避免這樣的情況)

三、 Event 和 Message

看了上面的描述,相信大家多少有些明白為什么要使用Event和Message了。具體的函數(shù)調(diào)用會(huì)帶來很多的問題(雖然從效率上講,這樣做是很好的)。為了提高程序的靈活性,Event和Message的辦法產(chǎn)生了。用名字解析的辦法代替通常的函數(shù)調(diào)用,這樣,如果雙方對(duì)這樣的解析是一致的話,就可以達(dá)到一個(gè)統(tǒng)一。不過Event和Message的作用還不僅僅是如此。

Event和Message還有建立進(jìn)程間通信的功能。進(jìn)程將自己的消息發(fā)給“控制中心”(簡(jiǎn)單的就是一個(gè)消息隊(duì)列,和一個(gè)while循環(huán)不斷的取消息隊(duì)列的內(nèi)容并執(zhí)行),控制程序得到消息,分發(fā)給相應(yīng)的進(jìn)程,這樣其他進(jìn)程就可以得到這個(gè)消息并進(jìn)行響應(yīng)。

Event和Message是很靈活的,因?yàn)槟憧梢噪S時(shí)添加或者關(guān)閉一個(gè)進(jìn)程,(僅僅需要添加分發(fā)消息的列表就可以了)Event和Message 從程序?qū)崿F(xiàn)上將我覺得是一樣的,只不過概念不同。Event多用于指一個(gè)動(dòng)作,比如硬件發(fā)生了什么事情,需要調(diào)用一個(gè)什么函數(shù)等等。Message多用于指一個(gè)指示,比如什么程序發(fā)生了什么操作命令等等。

四、 小結(jié)

其實(shí)編程序和寫文章一樣,都是先有一個(gè)提綱,然后慢慢的豐富。先抽象化得到程序的骨架,然后再考慮各個(gè)方面的其他內(nèi)容:程序極端的時(shí)候會(huì)發(fā)生什么問題?程序的這個(gè)地方的功能現(xiàn)在還不完善,以后再完善會(huì)有什么問題?程序是不是可以擴(kuò)展的?

二、類模擬的性能分析

? 類模擬中使用了大量的函數(shù)指針,結(jié)構(gòu)體等等,有必須對(duì)此進(jìn)行性能分析,以便觀察這樣的結(jié)構(gòu)對(duì)程序的整體性能有什么程度的影響。

  1.函數(shù)調(diào)用的開銷

#define COUNTER XX
void testfunc()
{
? int i,k=0;
? for(i=0;i<YY;i++)
}

  在測(cè)試程序里面,我們使用的是一個(gè)測(cè)試函數(shù),函數(shù)體內(nèi)部可以通過改變YY的值來改變函數(shù)的耗時(shí)。測(cè)試對(duì)比是 循環(huán)調(diào)用XX次函數(shù),和循環(huán)XX次函數(shù)內(nèi)部的YY循環(huán)。

  結(jié)果發(fā)現(xiàn),在YY足夠小,X足夠大的情況下,函數(shù)調(diào)用耗時(shí)成為了主要原因。所以當(dāng)一個(gè)“簡(jiǎn)單”功能需要“反復(fù)”調(diào)用的時(shí)候,將它編寫為函數(shù)將會(huì)對(duì)性能有影響。這個(gè)時(shí)候可以使用宏,或者inline關(guān)鍵字。

  但是,實(shí)際上我設(shè)置XX=10000000(1千萬(wàn))的時(shí)候,才出現(xiàn)ms級(jí)別的耗時(shí),對(duì)于非實(shí)時(shí)操作(UI等等),即使是很慢的cpu(嵌入式10M級(jí)別的),也只會(huì)在XX=10萬(wàn)的時(shí)候出現(xiàn)短暫的函數(shù)調(diào)用耗時(shí),所以實(shí)際上這個(gè)是可以忽略的。

  2.普通函數(shù)調(diào)用和函數(shù)指針調(diào)用的開銷

void (*tf)();
tf=testfunc;

  測(cè)試程序修改為一個(gè)使用函數(shù)調(diào)用,一個(gè)使用函數(shù)指針調(diào)用。測(cè)試發(fā)現(xiàn)對(duì)時(shí)間基本沒有什么影響。(在第一次編寫的時(shí)候,發(fā)現(xiàn)在函數(shù)調(diào)用出現(xiàn)耗時(shí)的情況下(XX=1億),函數(shù)指針的調(diào)用要慢(release版本),調(diào)用耗時(shí)350:500。后來才發(fā)現(xiàn)這個(gè)影響是由于將變量申請(qǐng)為全局的原因,全局變量的訪問要比局部變量慢很多)。

  3.函數(shù)指針和指針結(jié)構(gòu)訪問的開銷

struct a {
? void (*tf)();
}

  測(cè)試程序修改為使用結(jié)構(gòu)的函數(shù)指針,測(cè)試發(fā)現(xiàn)對(duì)時(shí)間基本沒有什么影響。其實(shí)使用結(jié)構(gòu)并不會(huì)產(chǎn)生影響,因?yàn)榻Y(jié)構(gòu)的訪問是固定偏移量的。所以結(jié)構(gòu)變量的訪問和普通變量的訪問對(duì)于機(jī)器碼來說是一樣的。

  測(cè)試結(jié)論:使用類模擬的辦法對(duì)性能不會(huì)產(chǎn)生太大的影響。

三、C語(yǔ)言的多態(tài)實(shí)現(xiàn)

  相信很多人都看過設(shè)計(jì)模式方面的書,大家有什么體會(huì)呢?Bridge,Proxy,F(xiàn)actory這些設(shè)計(jì)模式都是基于抽象類的。使用抽象對(duì)象是這里的一個(gè)核心。
? ?
  其實(shí)我覺得框架化編程的一個(gè)核心問題是抽象,用抽象的對(duì)象構(gòu)建程序的主體框架,這是面向?qū)ο缶幊痰钠毡樗枷搿S贸橄髽?gòu)建骨架,再加上多態(tài)就形成了一個(gè)完整的程序。由于C++語(yǔ)言本身實(shí)現(xiàn)了繼承和多態(tài),使用這樣的編程理念(理念啥意思?跟個(gè)風(fēng),嘿嘿)在C++中是十分普遍的現(xiàn)象,可以說Virtual(多態(tài))是VC的靈魂。

  但是,使用C語(yǔ)言的我們都快把這個(gè)多態(tài)忘光光了。我常聽見前輩說,類?多態(tài)?我們用的是C,把這些忘了吧。很不幸的是,我是一個(gè)固執(zhí)的人。這么好的東西,為啥不用呢。很高興的,在最近的一些純C代碼中,我看見了C中的多態(tài)!下面且聽我慢慢道來。

  1. VC中的Interface是什么

  Interface:中文解釋是接口,其實(shí)它表示的是一個(gè)純虛類。不過我所要說的是,在VC中的Interface其實(shí)就是struct,查找Interface的定義,你可以發(fā)現(xiàn)有這樣的宏定義:

? ? #Ifndef Interface
? ? #define Interface struct
? ? #endif

  而且,實(shí)際上在VC中,如果一個(gè)類有Virtual的函數(shù),則類里面會(huì)有vtable,它實(shí)際上是一個(gè)虛函數(shù)列表。實(shí)際上C++是從C發(fā)展而來的,它不過是在語(yǔ)言級(jí)別上支持了很多新功能,在C語(yǔ)言中,我們也可以使用這樣的功能,前提是我們不得不自己實(shí)現(xiàn)。

  2.C中如何實(shí)現(xiàn)純虛類(我稱它為純虛結(jié)構(gòu))

  比較前面,相信大家已經(jīng)豁然開朗了。使用struct組合函數(shù)指針就可以實(shí)現(xiàn)純虛類。

  例子:

? typedef struct {
? ? void (*Foo1)();
? ? char (*Foo2)();
? ? char* (*Foo3)(char* st);
? }
? MyVirtualInterface;
? ?
  這樣假設(shè)我們?cè)谥黧w框架中要使用橋模式。(我們的主類是DoMyAct,接口具體實(shí)現(xiàn)類是Act1,Act2)下面我將依次介紹這些“類”。(C中的“類”在前面有說明,這里換了一個(gè),是使用早期的數(shù)組的辦法)

  主類DoMyAct: 主類中含有MyVirtualInterface* m_pInterface; 主類有下函數(shù):

? DoMyAct_SetInterface(MyVirtualInterface* pInterface)
? {
? ? m_pInterface= pInterface;
? }
? DoMyAct_Do()
? {
? ? if(m_pInterface==NULL) return;
? ? m_pInterface->Foo1();
? ? c=m_pInterface->Foo2();
? }

  子類Act1:實(shí)現(xiàn)虛結(jié)構(gòu),含有MyVirtualInterface st[MAX]; 有以下函數(shù):

? MyVirtualInterface* Act1_CreatInterface()
? {
? ? index=FindValid() //對(duì)象池或者使用Malloc !應(yīng)該留在外面申請(qǐng),實(shí)例化
? ? if(index==-1) return NULL;
? ? St[index].Foo1=Act1_Foo1; // Act1_Foo1要在下面具體實(shí)現(xiàn)
? ? St[index].Foo2=Act1_Foo2;
? ? St[index].Foo3=Act1_Foo3;
? ? Return &st [index];
? }

  子類Act2同上。

  在main中,假設(shè)有一個(gè)對(duì)象List。List中存貯的是MyVirtualInterface指針,則有:

? if( (p= Act1_CreatInterface()) != NULL)
? List_AddObject(&List, p); //Add Al

? While(p=List_GetObject()){
? ? DoMyAct_SetInterface(p);//使用Interface代替了原來大篇幅的Switch Case
? ? DoMyAct_Do();//不要理會(huì)具體的什么樣的動(dòng)作,just do it
? }

? FREE ALL

四、類模擬和多態(tài),繼承

  在面向?qū)ο蟮恼Z(yǔ)言里面,出現(xiàn)了類的概念。這是編程思想的一種進(jìn)化。所謂類:是對(duì)特定數(shù)據(jù)的特定操作的集合體。所以說類包含了兩個(gè)范疇:數(shù)據(jù)和操作。而C語(yǔ)言中的struct僅僅是數(shù)據(jù)的集合。(
liyuming1978@163.com)

  1.實(shí)例:下面先從一個(gè)小例子看起

#ifndef C_Class
? ? #define C_Class struct
#endif

C_Class A {
? ? C_Class A *A_this;
? ? void (*Foo)(C_Class A *A_this);
? ? int a;
? ? int b;
};

C_Class B{ ? ? ? ? ? //B繼承了A
? ? C_Class B *B_this; //順序很重要
? ? void (*Foo)(C_Class B *Bthis); ? ? ? ? //虛函數(shù)
? ? int a;
? ? int b;

? ? int c;
};


void B_F2(C_Class B *Bthis)
{
? ? printf("It is B_Fun\n");
}

void A_Foo(C_Class A *Athis)
{
? ? printf("It is A.a=%d\n",Athis->a);//或者這里
// ? exit(1);
// ? printf("純虛 不允許執(zhí)行\(zhòng)n");//或者這里
}

void B_Foo(C_Class B *Bthis)
{
? ? printf("It is B.c=%d\n",Bthis->c);
}

void A_Creat(struct A* p)
{
? ? p->Foo=A_Foo;
? ? p->a=1;
? ? p->b=2;
? ? p->A_this=p;
}


void B_Creat(struct B* p)
{
? ? p->Foo=B_Foo;
? ? p->a=11;
? ? p->b=12; ? ?
? ? p->c=13;
? ? p->B_this=p;
}


int main(int argc, char* argv[])
{
? ? C_Class A *ma,a;
? ? C_Class B *mb,b;

? ? A_Creat(&a);//實(shí)例化
? ? B_Creat(&b);

? ? mb=&b;
? ? ma=&a;

? ? ma=(C_Class A*)mb;//引入多態(tài)指針
? ? printf("%d\n",ma->a);//可惜的就是 函數(shù)變量沒有private
? ? ma->Foo(ma);//多態(tài)
? ? a.Foo(&a);//不是多態(tài)了
? ? B_F2(&b);//成員函數(shù),因?yàn)樾蕟栴}不使用函數(shù)指針
? ? return 0;
}


  輸出結(jié)果:

11
It is B.c=13
It is A.a=1
It is B_Fun</P< p>

posted on 2006-06-26 18:31 井泉 閱讀(349) 評(píng)論(1)  編輯 收藏 引用 所屬分類: c軟件工程

評(píng)論

# re: C語(yǔ)言中的面向?qū)ο?a name="Post">  回復(fù)  更多評(píng)論   

列子不錯(cuò)
2010-03-09 16:11 | nfl 2010
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区三区欧美激情| 美女精品在线观看| 国产美女精品一区二区三区| 欧美激情一区在线观看| 欧美精品18| 国产精品区一区二区三| 国产日韩欧美在线播放不卡| 国产一区二区三区在线播放免费观看| 国产精品一区二区女厕厕| 国产日韩在线视频| 在线观看日韩av先锋影音电影院| 亚洲高清免费| 日韩午夜激情电影| 亚洲午夜伦理| 久久久一二三| 日韩视频一区二区三区在线播放免费观看 | 久久人人爽爽爽人久久久| 久久久久国内| 亚洲精品日韩久久| 性欧美长视频| 欧美大香线蕉线伊人久久国产精品| 欧美日韩一区在线观看| 一区二区视频免费在线观看| 一本一本大道香蕉久在线精品| 国产精品视频yy9099| 亚洲精品国产精品国自产观看浪潮| 在线电影欧美日韩一区二区私密| 一区二区激情| 久久亚洲精品视频| 亚洲最黄网站| 免费成人高清| 国产一区二区三区四区三区四| 在线视频欧美日韩精品| 你懂的视频欧美| 欧美在线1区| 国产精品一区二区在线观看| 日韩视频在线一区二区三区| 免费成人小视频| 久久精品国产69国产精品亚洲 | 国产精品高潮呻吟久久av黑人| 亚洲电影网站| 久久精品伊人| 亚洲欧美偷拍卡通变态| 欧美三级黄美女| 日韩一级网站| 欧美电影在线播放| 久久亚洲色图| 亚洲国产精品va在线观看黑人 | 欧美 日韩 国产 一区| 亚洲欧美国产精品桃花| 欧美人与禽猛交乱配视频| 黑人巨大精品欧美一区二区| 中文久久精品| 99pao成人国产永久免费视频| 欧美中文字幕视频| 国产亚洲一级高清| 欧美一区二区三区免费观看视频| 日韩一区二区精品葵司在线| 久热国产精品| 亚洲丁香婷深爱综合| 美女爽到呻吟久久久久| 久久福利毛片| 韩国一区电影| 久久野战av| 久久嫩草精品久久久精品一| 国产美女精品| 亚洲自拍偷拍网址| 亚洲欧美日韩国产一区二区三区 | 国产免费观看久久黄| 亚洲综合三区| 欧美一区二区视频网站| 国产日韩欧美亚洲一区| 久久精品视频在线看| 久久精品成人欧美大片古装| 国产综合av| 蜜臀久久99精品久久久久久9 | 欧美精品性视频| 亚洲国产精品一区制服丝袜| 久久亚洲综合| 裸体丰满少妇做受久久99精品 | 国产最新精品精品你懂的| 久久福利电影| 久久久国产精品亚洲一区| 精品粉嫩aⅴ一区二区三区四区| 久久精品综合| 免费不卡在线观看| 在线综合亚洲| 亚洲欧美日韩精品综合在线观看| 国产精品久久久久久久7电影| 久久不射2019中文字幕| 久久久午夜精品| 夜夜爽www精品| 久久精品中文字幕免费mv| 精品福利av| 亚洲日韩欧美视频一区| 欧美日韩国产一区二区| 欧美一区二粉嫩精品国产一线天| 久久精品国产2020观看福利| 亚洲伦伦在线| 欧美在线免费视频| 一本久久青青| 久久久www成人免费无遮挡大片| 日韩天堂在线视频| 欧美一级理论性理论a| 91久久久久久久久| 午夜精品久久久久久久99水蜜桃 | 欧美不卡三区| 国产精品video| 欧美成人免费小视频| 欧美午夜精品久久久| 美国三级日本三级久久99| 欧美视频日韩视频在线观看| 久久成人精品一区二区三区| 欧美激情第三页| 葵司免费一区二区三区四区五区| 欧美日韩一区二区精品| 玖玖玖免费嫩草在线影院一区| 国产精品成人国产乱一区| 亚洲国产日韩欧美在线动漫| 国内视频一区| 午夜久久美女| 小辣椒精品导航| 欧美日韩在线观看一区二区| 老司机久久99久久精品播放免费 | 麻豆精品精华液| 国产九九视频一区二区三区| 亚洲日韩欧美视频一区| 亚洲国产精品悠悠久久琪琪| 欧美一区二区三区日韩视频| 亚洲一区网站| 国产美女精品视频免费观看| 亚洲欧洲av一区二区| 欧美激情aaaa| 美女网站在线免费欧美精品| 国产精品久久久久三级| 午夜精品一区二区三区在线视| 欧美日韩国产综合网| 亚洲第一天堂av| 1204国产成人精品视频| 久久精品视频在线观看| 欧美中文字幕在线| 国产精品影视天天线| 一本久道久久久| 夜夜爽av福利精品导航| 欧美日韩精品一区二区| 亚洲欧洲精品一区二区精品久久久| 在线电影一区| 麻豆精品视频在线| 亚洲高清精品中出| 亚洲黄色在线观看| 欧美国产综合一区二区| 亚洲精品欧美一区二区三区| 亚洲免费观看高清完整版在线观看熊 | 国产麻豆91精品| 亚洲欧美日本精品| 欧美一区二区三区免费看| 国产女主播一区| 久久久精品动漫| 亚洲人成网站在线观看播放| 一区二区三区日韩精品视频| 国产精品高潮呻吟久久| 性色av一区二区三区| 久久影视精品| 亚洲精品一区二区三区樱花| 欧美日韩成人一区| 午夜精品av| 欧美国产一区二区| 亚洲一区成人| 激情欧美日韩| 欧美日韩午夜视频在线观看| 亚洲字幕在线观看| 欧美va天堂| 亚洲女优在线| 亚洲国产精品t66y| 国产精品一区久久久久| 久久久久久久高潮| 日韩视频在线播放| 久久精品视频一| 99v久久综合狠狠综合久久| 国产精品热久久久久夜色精品三区| 欧美在线观看网站| 日韩视频免费观看高清完整版| 欧美一区二区视频网站| 最新日韩在线| 国产亚洲精品久| 欧美日韩国产综合新一区| 久久久成人网| 亚洲一区二区三区免费在线观看| 久久综合九色欧美综合狠狠| 在线中文字幕不卡| 亚洲第一区在线观看| 亚洲综合99| …久久精品99久久香蕉国产| 欧美日韩一区二区三区在线 | 一本大道久久a久久精二百| 日韩亚洲视频在线| 国产精品视频内| 欧美成人午夜免费视在线看片| 中文久久乱码一区二区| 亚洲国产精品www|