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

posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

1. 能力測試

請回答下面的問題:

實現(xiàn)多態(tài)的效果,我們需要具備哪些條件?

上面的題目僅用于測試你是否具備閱讀本文的必要條件。如果你對此題毫無頭緒,那么我建議你盡快交叉本文。當(dāng)然,要順暢閱讀本文,你還需要具備一些C++、C++/CLI和C#的基礎(chǔ)知識。我想不必特別聲明,建議當(dāng)然是主觀的。不過我愿意再說一次:建議是主觀的,你有選擇。

 

2. ... In C++,

好吧,既然你走到這一步,我建議你堅持下去。當(dāng)然,你還是隨時可以交叉本文,總之,你有選擇。來,請先看看如下代碼:

 

// Code #01

#include
#include

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

}
;

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

}
;

class C : public A
{
public:
virtual void Print() override
{
std::cout << "C" << std::endl;
}

}
;

void Print(A arr[], int count)
{
for (int i = 0; i < count; ++i)
{
arr[i].Print();
}

}


int _tmain(int argc, _TCHAR* argv[])
{
const int COUNT = 11;

A a_arr[COUNT];
Print(a_arr, COUNT);

B b_arr[COUNT];
Print(b_arr, COUNT);

C c_arr[COUNT];
Print(c_arr, COUNT);

return 0;
}

 

  • A:請告訴我,Code #01有沒有問題?
  • B:Easy job!把它編譯并運(yùn)行一下就知道了唄!

接著,阿B編譯了這段代碼,程序運(yùn)行后,阿B發(fā)現(xiàn)輸出結(jié)果正是我們所期望的。于是,阿B得出結(jié)論:這段代碼沒問題!

然而,你是否知道這段代碼其實隱藏著一個計時炸彈,只要時機(jī)一到,它就會引爆并使你的程序完全癱瘓?不信?那我只好讓你見識一下這個炸彈引爆是的情景了。現(xiàn)在,我分別為class B和class C加入一個field,并修改一下main()以便給class B和class C里的field賦值(注意,本賦值操作不是必須的!):

 

// Code #02

#include
#include

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

}
;

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


long L;
}
;

class C : public A
{
public:
virtual void Print() override
{
std::cout << "C" << std::endl;
}


double D;
}
;

void Print(A arr[], int count)
{
for (int i = 0; i < count; ++i)
{
arr[i].Print();
}

}


int _tmain(int argc, _TCHAR* argv[])
{
const int COUNT = 11;

A a_arr[COUNT];
Print(a_arr, COUNT);

B b_arr[COUNT];
for (int i = 0; i < COUNT; ++i)
{
b_arr[i].L = 141214121412;
}

Print(b_arr, COUNT);

C c_arr[COUNT];
for (int i = 0; i < COUNT; ++i)
{
c_arr[i].D = 3.141592654;
}

Print(c_arr, COUNT);

return 0;
}

 

計時炸彈終于被引爆了:

可見程序無法找到b_arr[1]確切位置,其后果不會好過你在街上把一個背影看似相熟的女性誤認(rèn)為是你的女朋友時所產(chǎn)生的尷尬。至于產(chǎn)生這個問題的原因,Scott Meyers已經(jīng)在他的《More Effective C++》作了詳細(xì)的講解[1],這里我就沒必要重復(fù)勞動了。

顯然,產(chǎn)生這個問題的根本原因是數(shù)組里的存放物長度不一致,如果能夠讓存放物的長度統(tǒng)一起來,問題就會迎刃而解了。問題男提出把指針放進(jìn)數(shù)組,好吧,現(xiàn)在我們來看一下C++中多態(tài)與數(shù)組牽手的景象:

 

 

// Code #02'
// See Code #02 for Class A, Class B and Class C.

void Print(A *arr[], int count)
{
for (int i = 0; i < count; ++i)
{
arr[i]->Print();
}

}


int _tmain(int argc, _TCHAR* argv[])
{
const int COUNT = 11;

A** a_arr =
new A*[COUNT];
B** b_arr =
new B*[COUNT];
C** c_arr =
new C*[COUNT];
for (int i = 0; i < COUNT; ++i)
{
a_arr[i] =
new A;
b_arr[i] =
new B;
b_arr[i]->L = 141214121412;
c_arr[i] =
new C;
c_arr[i]->D = 3.141592654;
}

Print(a_arr, COUNT);
Print(reinterpret_cast< A** >(b_arr), COUNT);
Print(reinterpret_cast< A** >(c_arr), COUNT);

return 0;
}

 

問題解決了,不過,我還是強(qiáng)烈建議你(當(dāng)然,你有選擇!):

在C++中,請盡量使用STL中的容器類來協(xié)助實現(xiàn)多態(tài)的效果。

 

3. ... In C++/CLI,

在C++/CLI的托管類型(Managed Type)中,只有ref class(或ref struct[2]可用于建立繼承體系。下面,我們來看看在C++/CLI中使用數(shù)組實現(xiàn)多態(tài)的情形:

 

// Code #03

using namespace System;
using namespace stdcli::language;

ref class A
{
public:
virtual void Print()
{
Console::WriteLine("A");
}

}
;

ref class B : public A
{
public:
virtual void Print() override
{
Console::WriteLine("B");
}


long L;
}
;

ref class C : public A
{
public:
virtual void Print() override
{
Console::WriteLine("C");
}


double D;
}
;

void Print(array< A^ >^ arr)
{
for (int i = 0; i < arr->Count; ++i)
{
arr[i]->Print();
}

}


int _tmain()
{
const int COUNT = 11;

array< A^ >^ a_arr = gcnew array< A^ >(COUNT);
for (int i = 0; i < a_arr->Count; ++i)
{
a_arr[i] = gcnew A;
}

Print(a_arr);

array< B^ >^ b_arr = gcnew array< B^ >(COUNT);
for (int i = 0; i < b_arr->Count; ++i)
{
b_arr[i] = gcnew B;
b_arr[i]->l = 141214121412;
}

Print(b_arr);

array< C^ >^ c_arr = gcnew array< C^ >(COUNT);
for (int i = 0; i < c_arr->Count; ++i)
{
c_arr[i] = gcnew C;
c_arr[i]->d = 3.141592654;
}

Print(c_arr);
}

 

 

4. ... In C#,

而在C#中,使用數(shù)組來實現(xiàn)多態(tài)又是如何的呢:

 

// Code #04

using System;

class A
{
public virtual void Print()
{
Console.WriteLine("A");
}

}


class B : A
{
public override void Print()
{
Console.WriteLine("B");
}


public long L;
}


class C : A
{
public override void Print()
{
Console.WriteLine("C") ;
}


public double D;
}


class Program
{
static void Main(string[] args)
{
const int COUNT = 11;

A[] a_arr =
new A[COUNT];
for (int i = 0; i < a_arr.Length; i++)
{
a_arr[i] =
new A();
}

Print(a_arr);

B[] b_arr =
new B[COUNT];
for (int i = 0; i < b_arr.Length; i++)
{
b_arr[i] =
new B();
b_arr[i].L = 141214121412;
}

Print(b_arr);

C[] c_arr =
new C[COUNT];
for (int i = 0; i < c_arr.Length; i++)
{
c_arr[i] =
new C();
c_arr[i].D = 3.141592654;
}

Print(c_arr);
}


public static void Print(A[] arr)
{
for (int i = 0; i < arr.Length; ++i)
arr[i].Print();
}

}

 

 

5. 牽手的條件

其實,多態(tài)能夠牽上數(shù)組的手的條件很簡單:平等。回顧上面所有的代碼,我們不難發(fā)現(xiàn),數(shù)組中的存放物等長是完成多態(tài)效果的必要條件,否則,編譯器將被誤導(dǎo)繼而生成有問題的程序。

 

6. 關(guān)于舞臺

Code #01、Code #02和Code #03都是使用Visual C++ 2005 Express Edition Beta 1來編輯和編譯的,其中Code #01和Code #02是標(biāo)準(zhǔn)的Win32 Console Application,而Code #03是.NET Console Application。Code #04是使用Visual C# 2005 Express Edition Beta 1來編輯和編譯的。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品乱码久久久久久久久| 亚洲一区二区三区在线看| 午夜国产精品视频| 午夜欧美不卡精品aaaaa| 亚洲黄色性网站| 国产亚洲精品v| 亚洲综合视频一区| 亚洲一区三区电影在线观看| 欧美日韩直播| 亚洲日本久久| 亚洲欧美日韩在线不卡| 亚洲一区图片| 亚洲欧美日韩国产一区二区三区| 狠久久av成人天堂| 在线观看欧美| 亚洲精品视频在线观看网站| 亚洲毛片一区二区| 亚洲欧美国产三级| 久久精品中文| 亚洲国产精选| 亚洲欧美日韩成人| 性欧美videos另类喷潮| 久久艳片www.17c.com| 欧美精品高清视频| 国产视频精品网| 91久久精品一区二区三区| 亚洲精品色图| 亚洲欧美一区二区三区极速播放 | 久久精品一区二区三区不卡| 亚洲视频免费在线观看| 免费成人av| 国产精品久久久久久久久动漫| 韩国一区二区在线观看| 午夜国产不卡在线观看视频| 亚洲国产1区| 久久av资源网站| 欧美a级片网站| 国外成人在线视频| 久久精品一区二区国产| 亚洲视频每日更新| 欧美国产精品v| 亚洲电影免费观看高清完整版在线 | 国产亚洲亚洲| 亚洲一区在线直播| 亚洲精品久久久久久久久| 欧美a级一区二区| 欧美成人午夜激情在线| 久久―日本道色综合久久| 久久久夜色精品亚洲| 国产亚洲精品福利| 欧美一区二区成人6969| 亚洲欧美日韩精品综合在线观看| 久久精品国产久精国产思思| 国产精品一区二区黑丝| 亚洲一区日本| 欧美韩国在线| 国产亚洲人成a一在线v站 | 亚洲你懂的在线视频| 国产精品成人一区二区三区夜夜夜 | 性久久久久久久久久久久| 国产精品一区一区三区| 欧美二区在线看| 国产精品日韩欧美大师| 男女激情久久| 国产精品一区二区三区四区五区 | 亚洲福利电影| 午夜精品福利一区二区蜜股av| 在线观看亚洲一区| 亚洲一区三区电影在线观看| 亚洲第一精品福利| 欧美伊久线香蕉线新在线| 亚洲综合色婷婷| 欧美二区在线看| 欧美在线日韩精品| 欧美日韩中文在线观看| 女女同性女同一区二区三区91| 国产伦精品一区二区三区免费迷| 亚洲国产成人tv| 亚洲国产天堂久久综合网| 午夜精品99久久免费| 欧美一区二视频在线免费观看| 欧美精品在线视频观看| 亚洲国产一区二区精品专区| 精品99视频| 久久久久一区| 国产视频在线观看一区二区三区| 亚洲国产综合在线| 亚洲性线免费观看视频成熟| 欧美手机在线| 亚洲国产综合在线看不卡| 影音先锋另类| 欧美激情一级片一区二区| 欧美成人激情在线| 一区二区日韩精品| 国产一区在线免费观看| 久久国产精品99国产精| 蘑菇福利视频一区播放| 中国女人久久久| 黄网动漫久久久| 欧美日韩精品欧美日韩精品一| 一区二区国产在线观看| 亚洲综合国产| 亚洲精品一区二区三区婷婷月 | 亚洲国产精品激情在线观看| 亚洲一区二区毛片| 在线视频国内自拍亚洲视频| 欧美一区二区免费| 国产精品第一区| 久久精品人人做人人综合| 亚洲欧洲视频在线| 久久精品国语| 香蕉乱码成人久久天堂爱免费| 亚洲国产1区| 今天的高清视频免费播放成人 | 久久狠狠久久综合桃花| 亚洲三级国产| 亚洲精品午夜| 亚洲电影免费观看高清| 欧美视频一区二| 欧美精品在欧美一区二区少妇| 久久蜜桃精品| 久久久久久久欧美精品| 欧美在线观看一区二区| 日韩午夜剧场| 亚洲天堂成人在线视频| 亚洲综合欧美日韩| 亚洲综合大片69999| 亚洲国产激情| 免播放器亚洲一区| 亚洲国产精品专区久久 | 国产麻豆综合| 欧美日韩精品在线播放| 欧美日韩国产免费| 国产精品久久久久久五月尺| 欧美色视频在线| 国产综合在线看| 日韩视频免费在线观看| 亚洲黄色在线看| 羞羞答答国产精品www一本| 久久精品视频在线观看| 欧美美女bb生活片| 一区二区在线观看视频| 亚洲精品日韩久久| 午夜精品久久久久久久99樱桃 | 日韩一级精品视频在线观看| 午夜精品成人在线| 你懂的视频欧美| 国产精品一区视频网站| 亚洲国产岛国毛片在线| 亚洲日本欧美天堂| 久久黄色级2电影| 亚洲大黄网站| 亚洲精品一区二区三区在线观看| 午夜精品影院| 亚洲一区免费视频| av成人免费在线| 蜜桃精品久久久久久久免费影院| 麻豆久久精品| 欧美日韩视频在线观看一区二区三区| 国产三级精品在线不卡| 亚洲无人区一区| 亚洲精品视频啊美女在线直播| 欧美一区二区三区精品| 欧美区在线播放| 亚洲午夜精品久久| 一本色道久久88精品综合| 欧美不卡视频一区发布| 国产午夜精品理论片a级探花| 亚洲免费一在线| 亚洲欧美国产毛片在线| 国产一区激情| 欧美黄色一区二区| 亚洲视频欧洲视频| 国产欧美短视频| 久久精品国产2020观看福利| 香蕉成人伊视频在线观看| 国产精品久久久一本精品| 亚洲一区影音先锋| 久久aⅴ国产紧身牛仔裤| 亚洲激情偷拍| 欧美影院在线| 亚洲视频成人| 麻豆freexxxx性91精品| 欧美一区二区高清在线观看| 久久久久亚洲综合| 久久精品国产99国产精品澳门| 另类图片综合电影| 久久久亚洲一区| 国产一区二区视频在线观看| 一本色道精品久久一区二区三区| 国产午夜精品久久| 亚洲欧美日韩成人| 性欧美大战久久久久久久免费观看 | 一本一本大道香蕉久在线精品| 国产精品国产福利国产秒拍| 亚洲福利av| 一区二区免费看| 日韩小视频在线观看专区| 久久婷婷影院| 免费在线观看成人av|