virtual void fun1()=0; //純虛函數
virtual void fun1(){cout<<"A::fun1"<<endl;} //虛函數 void fun2(){cout<<"A::fun2"<<endl;} //函數 }; class B:public A{ public:void fun0(){cout<<"B::fun0"<<endl;}
void fun1(){cout<<"B::fun1"<<endl;} void fun2(){cout<<"B::fun2"<<endl;} }; int main() { A* b=new B(); //注意類型為A b->fun1(); b->fun2(); return 0; }結果:
B::fun0
B::fun1A::fun2
1. 虛函數和純虛函數可以定義在同一個類(class)中,含有純虛函數的類被稱為抽象類(abstract class),而只含有虛函數的類(class)不能被稱為抽象類(abstract class)。
2. 虛函數可以被直接使用,也可以被子類(sub class)重載以後以多態的形式調用,而純虛函數必須在子類(sub class)中實現該函數才可以使用,因為純虛函數在基類(base class)只有聲明而沒有定義。
3. 虛函數和純虛函數都可以在子類(sub class)中被重載,以多態的形式被調用。
4. 虛函數和純虛函數通常存在於抽象基類(abstract base class -ABC)之中,被繼承的子類重載,目的是提供一個統一的接口。
5. 虛函數的定義形式: virtual {method body}
純虛函數的定義形式:virtual { } = 0;
在虛函數和純虛函數的定義中不能有static標識符,原因很簡單,被static修飾的函數在編譯時候要求前期bind,然而虛函數卻是動態綁定(run-time bind),而且被兩者修飾的函數生命周期(life recycle)也不一樣。
6.如果一個類中含有純虛函數,那麼任何試圖對該類進行實例化的語句都將導致錯誤的產生,因為抽象基類(ABC)是不能被直接調用的。必須被子類繼承重載以後,根據要求調用子類的方法。
這個是C++內容!
虛函數和純虛函數不是一個東西!!!!
---------------------------------------
虛函數和純虛函數
在面向對象的C++語言中,虛函數(virtual function)是一個非常重要的概念。因為它充分體現了面向對象思想中的繼承和多態性這兩大特性,在C++語言裡應用極廣。比如在微軟的MFC類庫中,你會發現很多函數都有virtual關鍵字,也就是說,它們都是虛函數。難怪有人甚至稱虛函數是C++語言的精髓。
那麼,什麼是虛函數呢,我們先來看看微軟的解釋:
虛函數是指一個類中你希望重載的成員函數,當你用一個基類指針或引用指向一個繼承類對象的時候,你調用一個虛函數,實際調用的是繼承類的版本。
——摘自MSDN
這個定義說得不是很明白。MSDN中還給出了一個例子,但是它的例子也並不能很好的說明問題。我們自己編寫這樣一個例子:
#i nclude "stdio.h"
#i nclude "conio.h"
class Parent
{
public:
char data[20];
void Function1();
virtual void Function2(); // 這裡聲明Function2是虛函數
}parent;
void Parent::Function1()
{
printf("This is parent,function1\n");
}
void Parent::Function2()
{
printf("This is parent,function2\n");
}
class Child:public Parent
{
void Function1();
void Function2();
} child;
void Child::Function1()
{
printf("This is child,function1\n");
}
void Child::Function2()
{
printf("This is child,function2\n");
}
int main(int argc, char* argv[])
{
Parent *p; // 定義一個基類指針
if(_getch()=='c') // 如果輸入一個小寫字母c
p=&child; // 指向繼承類對象
else
p=&parent; // 否則指向基類對象
p->Function1(); // 這裡在編譯時會直接給出Parent::Function1()的
入口地址。
p->Function2(); // 注意這裡,執行的是哪一個Function2?
......余下全文>>
28.選D,只有類的成員函數及類的析構函數可以作為虛函數。
29.選D,A。可以給虛函數寫實現代碼,B。在基類和子類都可以。C,說反了。
30.選D,友元函數通過類的指針訪問類成員函數,不是this,他都不是要訪問那個類的成員函數,怎麼用this去訪問他。