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

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>
            久久看片网站| 另类欧美日韩国产在线| 夜夜爽99久久国产综合精品女不卡 | 性欧美xxxx视频在线观看| 欧美成人精品| 欧美国产高清| 亚洲美女福利视频网站| 久久亚洲一区| 亚洲欧美清纯在线制服| 欧美在线一级视频| 老色鬼久久亚洲一区二区| 久久久久久久久岛国免费| 国产色综合久久| 久久国产日韩| 欧美国产一区二区| 一区二区三区日韩精品视频| 欧美日韩国产综合久久| 亚洲久久一区| 久久九九热re6这里有精品| 国产一区二区中文| 老司机午夜精品| 亚洲欧洲三级| 一区二区三区在线视频观看| 欧美国产成人在线| 夜夜爽www精品| 老司机精品视频一区二区三区| 91久久精品一区二区别| 久久精品论坛| 一区二区精品国产| 国产一区二区丝袜高跟鞋图片| 久久精品欧美日韩精品| 亚洲精品在线视频| 欧美成人久久| 久久久久久高潮国产精品视| 日韩视频在线一区二区| 国产综合激情| 国产精品青草久久| 免费成人黄色| 久久久亚洲国产美女国产盗摄| 亚洲国产经典视频| 久久免费精品日本久久中文字幕| 中日韩美女免费视频网址在线观看| 黄色成人小视频| 老牛嫩草一区二区三区日本 | 亚洲大胆视频| 国产精品a级| 欧美午夜不卡影院在线观看完整版免费 | 亚洲黄色影院| 久久一区二区三区av| 亚洲欧美日韩国产综合精品二区| 一区二区自拍| 国产一区久久| 亚洲国产高潮在线观看| 亚洲高清中文字幕| 亚洲精品乱码久久久久久蜜桃91| 在线成人中文字幕| 在线视频中文亚洲| 亚洲欧美日韩中文在线制服| 日韩视频在线观看免费| 亚洲国产成人精品久久| 欧美国产日韩一区| 国产欧美精品| 欧美视频二区| 国产伦理一区| 伊人久久大香线| 日韩视频三区| 亚洲欧美日韩国产综合精品二区| 亚洲国产欧美一区二区三区同亚洲| ●精品国产综合乱码久久久久| 亚洲国产成人精品女人久久久| 亚洲精品国产精品久久清纯直播| 亚洲免费精彩视频| 欧美一二三视频| 欧美aⅴ99久久黑人专区| 亚洲国产合集| 久久成人18免费观看| 欧美精品一区二区三区很污很色的| 国产精品成人久久久久| 亚洲国产成人porn| 久久国产手机看片| 99视频一区二区三区| 亚洲一区国产精品| 老牛影视一区二区三区| 国产欧美一区二区精品婷婷| 洋洋av久久久久久久一区| 久久亚洲私人国产精品va| 99香蕉国产精品偷在线观看| 久久久久久久一区二区| 国产精品专区一| 亚洲午夜精品一区二区三区他趣| 欧美成人tv| 久久精品国产免费| 欧美性大战久久久久久久蜜臀| 欧美三级免费| 亚洲欧美另类久久久精品2019| 亚洲国产精品美女| 久久久久久久久久看片| 国内视频一区| 麻豆精品精华液| 久久国产精品电影| 狠狠色狠狠色综合人人| 久久国产乱子精品免费女| 99re热精品| 欧美日韩一级黄| 亚洲精品久久| 在线观看欧美激情| 久久久国产精彩视频美女艺术照福利 | 欧美日韩国产综合在线| 在线视频亚洲| 亚洲午夜精品久久久久久app| 国产精品播放| 久久综合狠狠综合久久激情| 久久国产精彩视频| 亚洲电影免费观看高清| 亚洲高清成人| 国产伦理一区| 亚洲国产精品福利| 国产日韩欧美中文| 亚洲国产你懂的| 国产精品xnxxcom| 亚洲视频电影图片偷拍一区| 午夜精品久久久久久久白皮肤| 亚洲高清不卡在线| 亚洲一区制服诱惑| 99re热这里只有精品视频| 亚洲一区二区三区中文字幕| 尤物视频一区二区| 亚洲天堂av电影| 亚洲精品影视在线观看| 午夜精品久久久久久久久| 亚洲美女精品成人在线视频| 亚洲欧美日韩精品久久久久| 一区二区久久久久| 老牛嫩草一区二区三区日本| 欧美一区二区三区在线看 | 亚洲一区二区在线看| 久久国产欧美| 久久手机免费观看| 欧美精品一二三| 久久福利毛片| 国产欧美一区二区三区另类精品 | 欧美久久久久久| 91久久久久久久久久久久久| 欧美日韩一区在线| 亚洲第一在线视频| 欧美在线视频免费| 久久gogo国模啪啪人体图| 国产精品视频xxxx| 亚洲欧美伊人| 噜噜爱69成人精品| 国产色产综合产在线视频| 欧美一区二区在线看| 亚洲精品久久久久| 欧美日韩免费观看一区二区三区| 亚洲一区二区少妇| 亚洲人成免费| 欧美一级电影久久| 亚洲国产精品国自产拍av秋霞| 欧美国产日韩亚洲一区| 欧美一区影院| 亚洲欧美视频一区| 一本久久综合亚洲鲁鲁| 亚洲人成啪啪网站| 亚洲人精品午夜在线观看| 久久一区二区精品| 久久精品日韩欧美| 午夜精品影院在线观看| 99精品99久久久久久宅男| 在线观看中文字幕不卡| 国产专区欧美精品| 国产亚洲va综合人人澡精品| 欧美性色aⅴ视频一区日韩精品| 媚黑女一区二区| 久久亚洲春色中文字幕| 久热爱精品视频线路一| 久久久久久亚洲精品中文字幕| 亚洲欧美视频一区| 欧美诱惑福利视频| 欧美怡红院视频一区二区三区| 欧美一级一区| 久久漫画官网| 欧美精品一线| 国产麻豆午夜三级精品| 激情久久久久| 99av国产精品欲麻豆| 亚洲女性裸体视频| 久久精品人人做人人爽电影蜜月| 久久精彩视频| 欧美激情国产日韩精品一区18| 亚洲国产精品久久久久婷婷884 | 国产综合色产| 欧美精品免费视频| 国产精品爽爽爽| 亚洲欧洲综合另类在线| 亚洲一区二区三区四区视频| 久久狠狠久久综合桃花| 欧美韩国日本一区| 亚洲夜间福利| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美人妖在线观看|