不能实例化抽象类的浅尝

来源:互联网 发布:小红帽linux安装教程 编辑:程序博客网 时间:2024/05/02 02:26

今天写代码,想实现个功能,写成一个界面类,做成了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函数复写,所以还请高手给我一种大家通用的方法。


原创粉丝点击