抽象基類不能被實例化?看我怎么破!


學過C++的應該都知道C++中的抽象基類,當我們需要一個基類不能被實例化時,抽象基類就需要上場了。

它通常是通過定義至少一個純虛函數來實現的,例如下面就是一個抽象基類的例子:

class Abstract
{
public:
    Abstract(int data = 0){
        m_data = data;
    };
    virtual int getdata() = 0;
private:
    int m_data;
};

這時我想要定義一個Abstract的實例,如

int _tmain(int argc, _TCHAR* argv[])
{
    Abstract a;
    return 0;
}

編譯就會出錯,提示

error C2259: “Abstract”: 不能實例化抽象類
1>        由於下列成員:
1>        “int Abstract::getdata(void)”: 是抽象的

 

這就是抽象基類的作用,能夠被繼承,但是不能被直接實例化。

如果我想要實例化抽象基類,怎么辦?其實還是有辦法的。

比如我如下例般定義一個抽象類的數組並初始化

int _tmain(int argc, _TCHAR* argv[])
{
    Abstract arr[1] = {3};
    return 0;
}

進行編譯,杠杠的,木有任何問題!

我想用抽象類來調用純虛函數?也木有任何問題,實際上,C++是允許純虛函數有定義的。這樣我們可以把代碼改成如下這樣。

class Abstract
{
public:
    Abstract(int data = 0){
        m_data = data;
    };
    virtual int getdata() = 0;
private:
    int m_data;
};

int Abstract::getdata(){
    return m_data;
}
int _tmain(int argc, _TCHAR* argv[])
{
    Abstract arr[1] = {3};

    cout<<arr[0].getdata()<<endl;
    
    return 0;
}

運行,可以看到結果是3!這正是我們想要的!

 

但是雖然上述方法能成功,但是如果想用定義好的抽象類直接初始化抽象類還是會出錯

    Abstract arr[1] = {3};
    Abstract a = arr[0];

編譯會出錯。

 

用指針或引用來指向對象則可以編譯成功

    Abstract arr[1] = {3};
    Abstract* a = &arr[0];

但是如果用指針或引用調用純虛函數則運行時會出錯

    cout<<a->getdata()<<endl;

 

如果用指針或引用調用非純虛函數,則能成功運行!

 

注:本實驗在VS2008專業版下進行,不同的環境,結果也可能不同。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM