程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ 虛函數與純虛函數,函數

C++ 虛函數與純虛函數,函數

編輯:C++入門知識

C++ 虛函數與純虛函數,函數


#include<iostream> #include<string> using namespace std; class A{ public:

    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::fun1

A::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去訪問他。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved