C++抽象設計目的

老司機的詩和遠方發表於2020-04-06

一、純虛擬函式定義

1.純虛擬函式是在基類中宣告的虛擬函式,首先最起碼是在基類中的虛擬函式
2.純虛擬函式在基類中是沒有定義的,這裡指基類,但任何子類中都要定義該純虛擬函式的實現方法
3.在基類中實現純虛擬函式的方法是虛擬函式原型後加“=0”,例如:
virtual void function()=0;

為什麼要引入純虛擬函式?

1.因為當你頂級基類A有一虛擬函式play();,而A的子類B也有play();,A的子類C也有play();,這就說明如果頂級基類A中的play();若定義怎麼玩是不合理的。因為B有B的玩法C有C的玩法。所以這種情況下定義為純虛擬函式目的在於使子類僅僅只是繼承函式的介面,告訴子類的設計者“你必須在子類中提供一個純虛擬函式的實現,但我不知道你會怎麼樣實現它
2.引入純虛擬函式,則編譯器要求在子類中必須予以重寫以實現多型性

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h>
#include <math.h>
#include <cmath>
#include <iostream>
using namespace std;

class A
{
public:
    virtual void play()=0;
    /*void run()
    {
        cout<<"A runing"<<endl;
    }*/
};

class B:public A
{
public:
    /*void play()
    {
        cout<<"B playing"<<endl;    
    }*/
};

class C:public A
{
public:
    /*void play()
    {
        cout<<"C playing"<<endl;    
    }*/ 
};
int main()
{
    //A *a=new B;
    A a;
    a.play();
    return 0;
}
  • 1

這裡寫圖片描述
錯誤提示A是抽象類,play是純虛擬函式
可以看出子類必須對純虛擬函式進行實現


二、什麼是抽象類

含有純虛擬函式的類稱為抽象類它不能生成物件,而且只能是基類

抽象類為什麼不能生成物件?

因為抽象類宣告瞭純虛擬函式,所以使用者不能建立類的純虛擬函式例項,只能建立它的派生類的例項

抽象類的作用

將有關的操作作為結果介面組織在一個繼承層次結構中,由它為子類提供一個公共的根,子類將具體實現在其基類中作為介面的操作。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h>
#include <math.h>
#include <cmath>
#include <iostream>
using namespace std;

class A
{
public:
    virtual void play()=0;
    void run()
    {
        cout<<"A runing"<<endl;
    }
};

class B:public A
{
public:
    void play()
    {
        cout<<"B playing"<<endl;    
    }
};

class C:public A
{
public:
    void play()
    {
        cout<<"C playing"<<endl;    
    }
};
int main()
{
    A *b=new B;
    b->play();
    A *c=new C;
    c->play();
    return 0;
}

這裡寫圖片描述


三、歸納ING

1.純虛擬函式沒有定義
2.純虛擬函式是用來規範子類的行為,即介面
3.抽象類不能定義例項,但可以宣告指向實現該抽象類的具體類的指標或引用
4.定義純虛擬函式就是為了讓基類不能例項化,因為例項化並沒有意義
5.純虛擬函式的引入更加安全:因為它避免了不小心沒有去實現的問題,它會提醒子類去做相應的實現
6.純虛擬函式的引入更加有效率:編碼的效率會提升!


轉載:http://blog.csdn.net/w_linux/article/details/70554828

相關文章