国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

虛機(jī)制在《面向?qū)ο蟪绦蛟O(shè)計(jì)C++》中的教學(xué)方法研究

2015-09-18 01:22韋慶清崔如春佛山科學(xué)技術(shù)學(xué)院電子與信息工程學(xué)院佛山528000
現(xiàn)代計(jì)算機(jī) 2015年15期
關(guān)鍵詞:面向?qū)ο?/a>程序設(shè)計(jì)定義

韋慶清,崔如春,李 婭(佛山科學(xué)技術(shù)學(xué)院電子與信息工程學(xué)院,佛山528000)

虛機(jī)制在《面向?qū)ο蟪绦蛟O(shè)計(jì)C++》中的教學(xué)方法研究

韋慶清,崔如春,李婭
(佛山科學(xué)技術(shù)學(xué)院電子與信息工程學(xué)院,佛山528000)

虛機(jī)制是《面向?qū)ο蟪绦蛟O(shè)計(jì)C++》課程的重要學(xué)習(xí)內(nèi)容。通過分析虛機(jī)制的基本特征,深入探討虛機(jī)制的教學(xué)重點(diǎn)、教學(xué)難點(diǎn)、教學(xué)手段及教學(xué)方法,并根據(jù)該課程的教學(xué)特點(diǎn),給出簡(jiǎn)易的應(yīng)用程序?qū)嵗f明虛機(jī)制在面向?qū)ο蟪绦蛟O(shè)計(jì)中的實(shí)際應(yīng)用,從而達(dá)到提高教學(xué)效果并順利完成教學(xué)任務(wù)的目的。

教學(xué)方法;面向?qū)ο蟪绦蛟O(shè)計(jì);虛機(jī)制

0 引言

《面向?qū)ο蟪绦蛟O(shè)計(jì)C++》是大學(xué)本科計(jì)算機(jī)專業(yè)課程,“封裝、繼承及多態(tài)”三大基本特征是《面向?qū)ο蟪绦蛟O(shè)計(jì)C++》課程的重要學(xué)習(xí)內(nèi)容,而貫穿這三大基本特征的學(xué)習(xí)則離不開其特有的虛機(jī)制對(duì)象,因此,從虛機(jī)制的基本教學(xué)內(nèi)容出發(fā),正確分析、探討其基本教學(xué)特征;把握其教學(xué)重點(diǎn)和教學(xué)難點(diǎn);設(shè)計(jì)、使用恰當(dāng)?shù)慕虒W(xué)手段和教學(xué)方法;最后實(shí)施并完成好其教學(xué)目標(biāo)是順利完成該課程教學(xué)任務(wù)的重要保證。

1 虛機(jī)制分析

在《面向?qū)ο蟪绦蛟O(shè)計(jì)C++》課程的課堂教學(xué)活動(dòng)過程中,主要圍繞著“封裝、繼承及多態(tài)”三大基本特征來展開相關(guān)知識(shí)內(nèi)容的教學(xué),而這三大特征的基本特點(diǎn)、基本原理和關(guān)鍵實(shí)現(xiàn)技術(shù)都離不開其特有的虛機(jī)制對(duì)象,常用的虛機(jī)制對(duì)象主要有虛函數(shù)、虛析構(gòu)函數(shù)和虛基類等[1]。盡管這三個(gè)虛機(jī)制對(duì)象都用一個(gè)相同的關(guān)鍵字virtual來修飾,但其功能、作用卻完全不同,在面向?qū)ο蟮某绦蛟O(shè)計(jì)過程中,虛函數(shù)主要用來實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)性;虛析構(gòu)函數(shù)主要用來實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編,確保調(diào)用各析構(gòu)函數(shù)使得在撤銷動(dòng)態(tài)分配空間的同時(shí)能得到正確的處理;而虛基類主要用來實(shí)現(xiàn)共享繼承以消除多重繼承引起的二義性。因此,在具體的教學(xué)活動(dòng)過程中應(yīng)分別設(shè)計(jì)、處理好各虛機(jī)制對(duì)象的實(shí)際教學(xué)。

2 虛機(jī)制的課堂教學(xué)過程

課堂教學(xué)是整個(gè)課程教學(xué)中的重要環(huán)節(jié),在這個(gè)環(huán)節(jié)中應(yīng)該充分利用好課堂的45分鐘時(shí)間,盡最大可能發(fā)揮好課堂教學(xué)的作用。因此,根據(jù)各不同的虛機(jī)制對(duì)象,應(yīng)選擇恰當(dāng)?shù)慕虒W(xué)方法來完成其課堂教學(xué)任務(wù)。

2.1虛函數(shù)

虛函數(shù),主要圍繞其基本概念、功能及應(yīng)用等三方面內(nèi)容進(jìn)行,重點(diǎn)講解什么是虛函數(shù),該函數(shù)有哪些基本特點(diǎn)、基本功能作用和實(shí)際應(yīng)用,難點(diǎn)在于設(shè)計(jì)恰當(dāng)?shù)某绦虼a以說明虛函數(shù)在實(shí)際程序設(shè)計(jì)中的具體應(yīng)用,并選擇講授法、討論法和演示法作為主要教學(xué)方法。虛函數(shù)具體的教學(xué)過程設(shè)計(jì)如下:

虛函數(shù)(virtual function)就是在一個(gè)類中用保留字virtual來定義的非靜態(tài)成員函數(shù)?;惖奶摵瘮?shù)在其派生類中仍然是虛函數(shù),并且一般需要在派生類中重定義。一個(gè)含有虛函數(shù)的類稱為多態(tài)類,無論這些虛函數(shù)是繼承下來的還是在派生類中新增加的[2]。在基類中說明虛函數(shù)的方法是:

virtual<函數(shù)返回類型><函數(shù)名>(<參數(shù)表>){…}

一個(gè)類的虛函數(shù)僅對(duì)派生類中重定義的函數(shù)起作用,而對(duì)其他函數(shù)沒有影響。在基類中使用虛函數(shù)保證通過指向基類的指針調(diào)用基類的一個(gè)虛函數(shù)時(shí),C++編譯系統(tǒng)對(duì)該調(diào)用進(jìn)行動(dòng)態(tài)綁定,而使用普通函數(shù)則是靜態(tài)綁定。

在派生類中重新定義虛函數(shù)時(shí),要求函數(shù)原型必須與其在基類中的原型(函數(shù)返回類型、函數(shù)名、函數(shù)參數(shù)個(gè)數(shù)及其類型)完全一致。此外,還必須借助于基類指針才得以動(dòng)態(tài)聯(lián)編進(jìn)而實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)性。否則,虛函數(shù)將按靜態(tài)聯(lián)編方式調(diào)用[3]。

值得注意的是,函數(shù)重定義與函數(shù)重載不同,它們是兩個(gè)不同的概念,具體定義時(shí)要注意其區(qū)別。以下實(shí)例程序代碼說明虛函數(shù)在多態(tài)中的應(yīng)用。

#include<iostream.h>

class BASE{

public:

virtual void fun1()

{cout<<"這是基類的虛函數(shù)fun1()."<<endl;}//在基類中定義一個(gè)虛函數(shù)fun1()

virtual void fun2()

{cout<<"這是基類的虛函數(shù)fun2()."<<endl;}//在基類中定義另一個(gè)虛函數(shù)fun2()

void fun3()

{cout<<"這是基類的普通函數(shù)fun3()."<<endl;}//在基類中定義一個(gè)普通函數(shù)fun3()

};

class DERIVED:public BASE{

public:

void fun1()

{cout<<"這是派生類的虛函數(shù)fun1()."<<endl;}//在派生類中重定義虛函數(shù)fun1()

void fun2(inta)

{cout<<"這是派生類的成員函數(shù)fun2()."<<endl;}//在派生類中重載fun2(),虛特性丟失

void fun3()

{cout<<"這是派生類的普通函數(shù)fun3()."<<endl;}//在派生類中定義普通函數(shù)fun3()

};

voidmain(){

BASE*p;DERIVED d;

p=&d;//定義基類指針指向派生類對(duì)象

p->fun1();//調(diào)用的是DERIVED::fun1(),動(dòng)態(tài)聯(lián)編

p->fun2();//調(diào)用的是BASE::fun2(),靜態(tài)聯(lián)編,虛特性丟失

p->fun3();//調(diào)用的是BASE::fun3(),靜態(tài)聯(lián)編}

程序運(yùn)行結(jié)果如圖1所示:

圖1 虛函數(shù)在多態(tài)中的應(yīng)用

由此可見,在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,虛函數(shù)是實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)性不可缺少的前提條件。

2.2虛析構(gòu)函數(shù)

在對(duì)虛析構(gòu)函數(shù)所進(jìn)行的教學(xué)活動(dòng)設(shè)計(jì)過程中,應(yīng)把該函數(shù)的基本概念和基本功能特征等內(nèi)容作為教學(xué)重點(diǎn)講解,而把設(shè)計(jì)一個(gè)程序?qū)嵗鳛榻虒W(xué)難點(diǎn),用來加以分析說明虛析構(gòu)函數(shù)在類封裝中的實(shí)際應(yīng)用,并選擇講授法、對(duì)比法和演示法作為主要教學(xué)方法。虛析構(gòu)函數(shù)具體的教學(xué)過程設(shè)計(jì)如下:

什么是虛析構(gòu)函數(shù)?虛析構(gòu)函數(shù)是指在析構(gòu)函數(shù)前加上關(guān)鍵字virtual進(jìn)行說明,則該析構(gòu)函數(shù)稱為虛析構(gòu)函數(shù)。例如:

class A{

virtual~A(){…}//則為類A聲明了一個(gè)虛析構(gòu)函數(shù)

};

通常,習(xí)慣將基類的析構(gòu)函數(shù)聲明為虛析構(gòu)函數(shù)。當(dāng)基類的析構(gòu)函數(shù)聲明為虛析構(gòu)函數(shù)時(shí),無論指針指的是同類族中的哪一個(gè)類對(duì)象,系統(tǒng)會(huì)采用動(dòng)態(tài)關(guān)聯(lián),調(diào)用相應(yīng)的析構(gòu)函數(shù),對(duì)該對(duì)象執(zhí)行清理工作,這樣能更好避免內(nèi)存泄漏現(xiàn)象[4]。以下程序代碼說明虛析構(gòu)函數(shù)的具體應(yīng)用。

#include<iostream.h>

class A{

public:

virtual~A(){cout<<"這是類A的虛析構(gòu)函數(shù)"<<endl;} //類A聲明的虛析構(gòu)函數(shù)

//~A(){cout<<"這是類A的析構(gòu)函數(shù)"<<endl;}

};

class B:public A{

public:

B(){ptr=new int[20];}

virtual~B(){//類B聲明的虛析構(gòu)函數(shù)

cout<<"這是類B的虛析構(gòu)函數(shù)"<<endl;

delete[]ptr;

}

//~B(){cout<<"這是類B的析構(gòu)函數(shù)"<<endl;delete[]ptr;} private:int*ptr;

};

intmain(){

A*p=new B;

delete p;

return 0;

}

程序運(yùn)行結(jié)果如圖2所示:

圖2 虛析構(gòu)函數(shù)的應(yīng)用

如果將上述程序代碼中類A和類B所聲明的虛析構(gòu)函數(shù)改為析構(gòu)函數(shù),則程序運(yùn)行結(jié)果僅顯示:這是類A的虛析構(gòu)函數(shù)。顯然,在執(zhí)行delete p;語(yǔ)句時(shí)并沒有調(diào)用到類B的析構(gòu)函數(shù),因而引起內(nèi)存泄漏。所以,通常是將基類的析構(gòu)函數(shù)聲明為虛析構(gòu)函數(shù),這樣在用delete釋放資源的時(shí)候,確保析構(gòu)函數(shù)會(huì)被正確調(diào)用。

2.3虛基類

虛基類與前面所講授的虛函數(shù)、虛析構(gòu)函數(shù)相似。其具體的教學(xué)過程設(shè)計(jì)如下。

為什么要引入虛基類?因?yàn)樵诨贑++的面向?qū)ο蟪绦蛟O(shè)計(jì)的實(shí)際應(yīng)用中,若在多重繼承時(shí)沒有作特殊聲明,此時(shí)采用的是復(fù)制繼承,會(huì)導(dǎo)致重復(fù)繼承所帶來的二義性問題。下面引入一個(gè)程序代碼作分析說明。#include<iostream.h>

class BASE{public:int i;};

class BASE1:public BASE{public:int j;};

class BASE2:public BASE{public:int k;};

class DERIVED:public BASE1,public BASE2{public:int sum;};

void main(){

DERIVED obj;//聲明一個(gè)派生類對(duì)象

//obj.i=3;//編譯錯(cuò)誤,編譯程序無法確定使用i的哪一份副本

obj.j=5;//編譯正確,使用從BASE1繼承下來的j

obj.k=7;//編譯正確,使用從BASE2繼承下來的k}

通常,C++語(yǔ)言有兩種方法解決這種二義性問題。第一種方法是采用作用域運(yùn)算符“::”來解決,但這不是一種很好的解決途徑;另一種方法是使用虛基類機(jī)制(Virtual Base Class)來解決。虛基類可以保證在任何派生類中只提供一個(gè)基類的副本,達(dá)到消除二義性問題的目的。

虛基類是當(dāng)基類被繼承時(shí),在基類的繼承訪問控制關(guān)鍵字前面加上關(guān)鍵字virtual來定義的。聲明虛基類的方法是:class派生類:virtual訪問權(quán)限修飾符父類名{…};

現(xiàn)使用虛基類將上面程序代碼修改如下:

#include<iostream.h>

class BASE{public:int i;};

class BASE1:virtual public BASE{public:int j;};

class BASE2:virtual public BASE{public:int k;};

class DERIVED:public BASE1,public BASE2{public:int sum;};

void main(){

DERIVED obj;//聲明一個(gè)派生類對(duì)象

obj.i=3;//編譯正確,

obj.j=5;//編譯正確,使用從BASE1繼承下來的j

obj.k=7;//編譯正確,使用從BASE2繼承下來的k

}

可見,普通基類與虛基類之間的唯一區(qū)別只有在派生類重復(fù)繼承了某一基類時(shí)才表現(xiàn)出來,虛基類用于實(shí)現(xiàn)共享繼承。該程序代碼所實(shí)現(xiàn)的共享繼承如圖3所示,其相應(yīng)的對(duì)象存儲(chǔ)結(jié)構(gòu)分配如圖4所示:

圖3 共享繼承示意圖

圖4 對(duì)象存儲(chǔ)結(jié)構(gòu)分配圖

(1)必須在最新派生出來的派生類的初始化列表中調(diào)用虛基類的構(gòu)造函數(shù),以初始化在虛基類中定義的數(shù)據(jù)成員;

(2)注意在調(diào)用各構(gòu)造函數(shù)時(shí),最先調(diào)用虛基類的構(gòu)造函數(shù),再調(diào)用其他構(gòu)造函數(shù);

(3)虛基類的構(gòu)造函數(shù)僅調(diào)用一次[5]。

3 虛機(jī)制的應(yīng)用實(shí)踐過程

盡管在課堂上講授了面向?qū)ο蟪绦蛟O(shè)計(jì)C++中虛機(jī)制的基本特征、功能作用等基本理論基礎(chǔ)知識(shí),但要學(xué)生在短時(shí)間內(nèi)很好理解、掌握并能實(shí)際應(yīng)用,還必須經(jīng)過編程訓(xùn)練這一課外實(shí)踐環(huán)節(jié),從而延伸、反轉(zhuǎn)課堂,以學(xué)生為主,逐步引導(dǎo)學(xué)生將其基本思想、理論和技術(shù)綜合應(yīng)用到實(shí)際程序開發(fā)設(shè)計(jì)中。在此,通過一個(gè)案例設(shè)計(jì)來分析說明虛機(jī)制在面向?qū)ο蟪绦蛟O(shè)計(jì)中的綜合應(yīng)用。

實(shí)例:將虛函數(shù)、虛析構(gòu)函數(shù)和虛基類這三個(gè)虛機(jī)制對(duì)象綜合應(yīng)用到一個(gè)實(shí)際的面向?qū)ο蟪绦蛟O(shè)計(jì)中。

程序代碼說明如下:

#include<iostream.h>

#include<string.h>

class Person{//定義基類

protected:char*name;

int age;

public:Person(char*nm,inta){

name=new char[strlen(nm)+1];

strcpy(name,nm);

age=a;

}

virtual~Person(){delete[]name;}//聲明基類的虛析構(gòu)函數(shù)

virtual void show(){cout<<name<<""<<age<<"";} //聲明虛函數(shù)

};

class Student:virtual public Person{//聲明由虛基類派生

protected:char*number;

int score;

public:

Student(char*nm,int a,char*no,int sc):Person(nm,a){

number=new char[strlen(no)+1];

strcpy(number,no);

score=sc;

}

virtual~Student(){delete[]number;}//聲明派生類的虛析構(gòu)函數(shù)

void show(){//虛函數(shù)重定義

Person::show();

cout<<number<<""<<score<<end l;

}

};

class Staff:virtual public Person{//聲明由虛基類派生

protected:char*idnumber;

floatwage;

public:

Staff(char*nm,inta,char*id,floatw):Person(nm,a){

idnumber=new char[strlen(id)+1];

strcpy(idnumber,id);

wage=w;

}

virtual~Staff(){delete[]idnumber;}//聲明派生的虛析構(gòu)函數(shù)

void show(){//虛函數(shù)重定義

Person::show();

cout<<idnumber<<""<<wage<<endl;

}

};

class StaffStudent:public Staff,public Student{//多重繼承

public:

StaffStudent(char*nm,inta,char*id,floatw,char*no,int sc):

Staff(nm,a,id,w),Student(nm,a,no,sc),Person(nm,a){}

void show(){//虛函數(shù)重定義

Person::show();

cout<<idnumber<<""<<wage<<""<<number<<""<<score<<""<<endl;

}

};

voidmain(){

Person*p;

Student st("李剛",19,"20151301",560);

Staff sf("王艷",29,"010",3500.9);

StaffStudent ss("鄧軍",25,"014",4500.5,"20151306",580);

p=&st;

p->show();//實(shí)現(xiàn)多態(tài)

p=&sf;

p->show();

p=&ss;

p->show();

}

程序運(yùn)行結(jié)果如圖5所示:

圖5 虛機(jī)制的綜合應(yīng)用

4 結(jié)語(yǔ)

綜上所述,虛機(jī)制貫穿著《面向?qū)ο蟪绦蛟O(shè)計(jì)C++》教學(xué)過程的始終,而虛機(jī)制特征主要通過虛函數(shù)、虛析構(gòu)函數(shù)和虛基類等這三個(gè)虛機(jī)制對(duì)象來具體實(shí)現(xiàn)。因此,在實(shí)際的教學(xué)活動(dòng)過程中,應(yīng)該設(shè)計(jì)并使用靈活、恰當(dāng)?shù)慕虒W(xué)手段和教學(xué)方法來完成這三個(gè)虛機(jī)制對(duì)象的具體教學(xué)任務(wù),以利于指導(dǎo)學(xué)生更好地理解、掌握虛機(jī)制對(duì)象的基本功能特征及其應(yīng)用,并有效激發(fā)學(xué)生的學(xué)習(xí)興趣,從而達(dá)到提高本課程教學(xué)質(zhì)量、取得良好教學(xué)效果的目的。

[1]甘玲,邱勁.面向?qū)ο蠹夹g(shù)與Visual C++[M].北京:清華大學(xué)出版社,2006:4~7

[2]李師賢,李文軍,周曉聰,等.面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)(第二版)[M].北京:高等教育出版社,2011:316~318

[3]張冰.面向?qū)ο蟪绦蛟O(shè)計(jì)C++語(yǔ)言編程[M].北京:機(jī)械工業(yè)出版社,2008:154~155

[4]譚浩強(qiáng).C++程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2004:407~408

[5]張海藩,牟永敏.面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)用教程(第二版)[M].北京:清華大學(xué)出版社,2007:165~167

Teaching Method;Object-Oriented Programming;VirtualMechanism

Research on the Method of VirtualMechanism in Object-Oriented Programm ing C++Course

WEIQing-qing,CUIRu-chun,LIYa
(School of Electronics and Information Engineering,Foshan University,Foshan 528000)

Virtualmechanism is the important study content in the Object-Oriented Programming C++course.Analyses the basic characteristics of virtualmechanism,and explores teaching emphasis,teaching difficulties,teachingmeans and teachingmethods of the virtualmechanism. Combiningwith the characteristics of the course learning,gives specific application examples to show the practical application of the virtualmechanism in object-oriented program design.Improves the teaching effectand completes the teaching task successfully.

1007-1423(2015)15-0021-06

10.3969/j.issn.1007-1423.2015.15.006

韋慶清(1966-),女,廣西河池人,碩士,講師,研究方向?yàn)橛?jì)算機(jī)應(yīng)用

崔如春(1965-),男,湖南沅江人,碩士,副教授,研究方向?yàn)橛?jì)算機(jī)應(yīng)用

李婭(1978-),女,湖北黃石河人,碩士,講師,研究方向?yàn)橹悄軆?yōu)化算法

2015-04-21

2015-05-06

猜你喜歡
面向?qū)ο?/a>程序設(shè)計(jì)定義
基于Visual Studio Code的C語(yǔ)言程序設(shè)計(jì)實(shí)踐教學(xué)探索
從細(xì)節(jié)入手,談PLC程序設(shè)計(jì)技巧
高職高專院校C語(yǔ)言程序設(shè)計(jì)教學(xué)改革探索
面向?qū)ο骔eb開發(fā)編程語(yǔ)言的的評(píng)估方法
成功的定義
峰叢洼地農(nóng)作物面向?qū)ο笮畔⑻崛∫?guī)則集
基于面向?qū)ο蟮能囕v管理軟件的研制與開發(fā)
PLC梯形圖程序設(shè)計(jì)技巧及應(yīng)用
面向?qū)ο蟮腟oS體系結(jié)構(gòu)建模方法及應(yīng)用
修辭學(xué)的重大定義
滕州市| 高安市| 东乌珠穆沁旗| 郑州市| 洮南市| 遵义市| 阜新市| 通江县| 阜宁县| 龙门县| 天镇县| 仪征市| 临武县| 策勒县| 社会| 正定县| 如东县| 曲阜市| 开化县| 收藏| 延川县| 西宁市| 大英县| 肥城市| 孝义市| 岗巴县| 炎陵县| 保德县| 弥渡县| 栾川县| 陈巴尔虎旗| 彭水| 专栏| 钦州市| 柯坪县| 靖西县| 中西区| 顺平县| 扎囊县| 罗甸县| 安陆市|