不能執行個體化抽象類別的淺嘗

來源:互聯網
上載者:User

今天寫代碼,想實現個功能,寫成一個介面類,做成了CView的子類,編譯無法通過,說是不能執行個體化抽象類別,由於CView::OnDraw是抽象的。這個問題我是第一次遇到,於是網上搜了一下都不能得到滿意的答案。找出C++方面的書認真分析了一下,又收穫不少。

首先對於虛函數存在的意義有了新的認識。

如果沒有虛函數,對於“基類的指標”指向“衍生類別的對象”,只能由該指標調用基類所定義的函數。例如:

class CA{void B();}class Ca:public CA{void B();}CA* pA;CA A1;Ca a1;pA = &a1;pA->B();    // 其實這句調用的是CA::B();

有了虛函數後,將上述兩個B函數都聲明成virtual函數,則有

pA = &a1;pA->B();    // 其實這句調用的是Ca::B();pA = &A1;pA->B();    // 其實這句調用的是CA::B();

這就是我總結的虛函數的妙用,但應該理解還不是很深刻,歡迎高手拍磚。

回到我之前的問題,MFC中有兩個十分重要的虛函數,document中的Sirialize函數和view中的OnDraw函數。而這兩個函數又是純虛函數,需要使用者在自己的CMyDoc和CMyView中改寫,而我的類繼承了CView,卻沒有改寫OnDraw函數,就變成了抽象類別,不能對其執行個體,於是就有了報錯“不能執行個體化抽象類別”。bingo!

但是我還沒太想好好的解決辦法,如果把我做的類繼承改為CWnd,我類裡的部分函數就無法使用,如getDC()。本身又不想把OnDraw函數複寫,所以還請高手給我一種大家通用的方法。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.