遭遇C++基础问题 [2004年5月29日 18:33 ]

原创 2004年07月11日 03:46:00

用VC++有一段时间了,却发现用VC这么久,C++其实没学到什么。基本的不能再基本了,真正用起来还有深有体会的感觉。

需要定义三个对象,一个基类A,另外两个A1,A2从这个基类派生。说起来也就是用不用Virtual的问题,很简单,或许是没有注意过,或许注意过,也像这次一样灵犀一动,也在不经意的时候就忘记了,要不是现在开始在Linux下面写程序,还不知道什么时候能在注意起来。写一写,或许下次我就能很快地想起了。其实,试一下也就出来了,不是吗?

class A
{
 CList m_lsPoint;
 virtual void AddPoint()
        {
  m_lsPoint.Add(CPoint(0,0));
 }
 CList m_lsPoint2;
 void AddPoint2()
        {
  m_lsPoint2.Add(CPoint(0,0));
 }
};
class A1:public A
{
 void AddPoint()
 {
  m_lsPoint.Add(CPoint(1,1));
 }
 void AddPoint2()
 {
  m_lsPoint2.Add(CPoint(1,1));
 }
};
上面基类A中两个AddPoint的区别是一个有virtual,一个没有。测试代码如下:

 A1 *a1=new A1;
  ((A*)a1)->AddPoint();
 ((A*)a1)->AddPoint2();

上面两个函数的调用方法一样,可是最后查看m_lsPoint和m_lsPoint2的列表却发现加进去的点是不一样的m_lsPoint的点是(1,1),而m_lsPoint2的点是(0,0)。对此,作如下感想:

1.virtual修饰的是虚函数,顾名思义是从他派生出来以后,基类的这个函数就不再创建出来。A的AddPoint函数。AddPoint2没有用virtual修饰,虽然在直接调用a1->AddPoint2()的时候,并不执行a->AddPoint2(),但是,可以通过指针转换,来得到实际上存在的A类的AddPoint2函数。

2.A1从A派生,即A1具有了A的所有属性,比如一个学生的班级,学号属性在A中,A1中包含了他的各门功课成绩。要更新该学生的班级或者学号,但是实际上获得的信息只有A类的成员(班级,学号),如果直接从A1更新(即连同各成绩),必然会产生错误。这时候,需要的是不使用virtual关键字的基类。结构如下:

                                    |-班级
          | ——学生——|
          |                         |-学号
学生  |
信息  |——语文成绩
          |——数学成绩
          |——。。。
3.在用VC的时候经常也会用到virtual关键字,不过常常是直接在继承的时候用这种方法。比如

 void A1::AddPoint()
 {
  A::AddPoint();
  m_lsPoint.Add(CPoint(0,0));
 }

这种方法就变成了上面说到的那样,一次把基类,派生类的属性(成员)都更新了。但是,如果基类不是Virtual这样做就没有用了。想到,要是在A1::AddPoint2中也像这样加上父类的函数又没效呢?发现没效,再用这样((A*)this)->AddPoint2();也同样无用。这下我就不懂了。世上我不懂的事情太多了。

VC中的OnDraw,OnPaint之类的函数,也是virtual,却不调用基类的函数。按照1的思考,基类的这些函数就不用创建出来,也就节省了内存。是吗?不是吗?

晕!一直都在用MFC,根本不用去考虑类的结构,布局,一切按照微软布下的模板走路。真是失败,也该学学自己走路了。基类的结构真得很重要,就做类似上面那样的几个类,当然派生出来的不只有A1一个,却因为基类定义得太差,想改,却是别人写的,而且他是老员工,失败。派生类我在用,为了多几个接口,连本该基类写的东西,也放到派生类写了(屡次要求无效)。所谓面对对象的程序,实在郁闷。

这次在Unix下面做程序,才有以上遭遇,学学Linux,Unix,VI,有新事物出现,我又有动力了。

我。。。还。。。活着!

关于java的一些问题,比较基础,大家可以看看咯

问题:一瓶汽水一块钱,喝完退五毛钱,有20元,用java程序写20元能喝多少汽水 回答: int a; int i; a=20; i=0; a=2*a; while(a>2){ a=a-1; i=...
  • u012187684
  • u012187684
  • 2016年11月21日 18:59
  • 872

2017年5月20日软考考试报名开始啦

2017年上半年软考信息系统项目管理师、系统集成项目管理工程师、信息安全工程师考试将于2017年5月20日举行,目前全国所有省市都已发布报名简章通知,各位学员注意按报名简章通知在规定时间完成报名。 ...
  • aura2015
  • aura2015
  • 2017年03月13日 17:25
  • 557

2004年8月28日

下了4天雨了,每天在房子里看书,睡觉。有时候挺烦,晚上在灯下看书的时候,有挺喜欢那份平静,任它外面风吹雨打,我却如此平静,倒也有一番意境。附:从下雨那天起,她就感冒发烧,而且还挺厉害。前天打了退烧针,...
  • mwaterfall
  • mwaterfall
  • 2004年08月28日 00:10
  • 831

2014年5月27日中国大陆封锁Google事件解决办法

2014年5月27日中国大陆封锁Google事件指自2014年5月27日后,Google公司的各项服务遭到疑似来自防火长城的恶意干扰,导致中国大陆地区的用户无法正常使用其服务的事件。自当天起,来自中国...
  • rain_butterfly
  • rain_butterfly
  • 2014年07月14日 15:15
  • 4095

2017年05月13日勒索软件, 勒索病毒(WannaCry)肆虐全球, 中国安全防线严重受挫

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX 个人网站: https://www.x86asm.org QQ交流: 643439947 编程生涯: 2001年~至今[共16...
  • Code_GodFather
  • Code_GodFather
  • 2017年05月13日 17:37
  • 2520

2004年2月28日,星期六(2)

    我感叹中国人之多,中国贫富差距之大,中国不平等之广泛。    唉,不感叹了,我上火车后,我知道我没有座位,然后朝火车的尾部走去,按照惯例,火车尾部总有一节车厢是机动的。呵呵,我的判断是正确的。...
  • sun_DouDou
  • sun_DouDou
  • 2006年08月09日 17:21
  • 880

2018年1月29日训练日记

今天的主要任务是看网络流的资料。虽然看了3个ppt和两个word以及一些例题,但是还是感觉不懂。这里先把概念贴一下。。。 by 某个dalao的博客: 网络流是指给定一个有向图,和两个点–源点S和...
  • LSD20164388
  • LSD20164388
  • 2018年01月29日 21:33
  • 86

2009年5月22日星期五

Dojo 工具包简介Posted 05/07/2009 - 10:37 by daitaoDojo JavaScript Dojo 工具包简介作者 SitePen, Inc. · 2008年12月12...
  • Fish3812
  • Fish3812
  • 2009年05月22日 11:16
  • 645

使用BeautifulSoup爬取“0daydown”网站的信息(2)——字符编码问题解决

上篇中的程序实现了抓取0daydown最新的10页信息,输出是直接输出到控制台里面。再次改进代码时我准备把它们写入到一个TXT文档中。这是问题就出来了。 最初我的代码如下: #-*- coding: ...
  • abclixu123
  • abclixu123
  • 2015年03月16日 23:37
  • 3649

2004雅典奥运会开幕

终于等到开幕式了,不知道有多少个国家的代表队入场了,中国队还是没有出现等待着那一刻,China!红色的队伍,竟然是西班牙,以前中国队也穿过红西装的,很鲜艳,也很漂亮中国队这次好像是要穿黑色的西装吧。继...
  • lastking
  • lastking
  • 2004年08月14日 03:18
  • 878
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:遭遇C++基础问题 [2004年5月29日 18:33 ]
举报原因:
原因补充:

(最多只允许输入30个字)