遭遇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,有新事物出现,我又有动力了。

我。。。还。。。活着!

C++ switch语句详解

除了用嵌套if语句外,C++中还提供switch语句,又称为“开关语句”,用来实现多分支(多选一)。 switch语句的功能是:根据给定条件从多个分支语句序列中选择一个作为执行入口。 基本格式...
  • iai64824
  • iai64824
  • 2017年02月07日 12:28
  • 644

对C++基础知识的总结(主要针对笔试面试)

C++的魅力在于其丰富多彩的性格特征:其行为方式既可以像C一样面向过程也可以面向对象(专注Class 很多年)、封装性(城府很深)、继承性(富二代)、多态性(多重人格/精神分裂/变态),谜一样的男神,...
  • black_yu
  • black_yu
  • 2016年03月19日 17:37
  • 1290

C++基础知识汇总

C++面试题——基础概念篇 唐璐 http://blog.csdn.net/worldwindjp/         面试C++程序员的时候一般都是3板斧,先是基础问答,然后一顿...
  • weiyuefei
  • weiyuefei
  • 2016年08月01日 20:59
  • 943

面试---c和c++的区别

C是一个结构化语言,如谭老爷子所说:它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。C++首要考虑的是如何构造...
  • will130
  • will130
  • 2015年09月23日 17:23
  • 714

C++常见问题系列(一)——基础问题

三种基本数据类型 , 递归,汉诺塔问题
  • u010402786
  • u010402786
  • 2016年05月11日 11:24
  • 519

《Effective C++》设计与声明:条款18-条款19

这两个条款讲的是:接口的设计和类的设计。其中接口的设计原则是让接口容易被正确使用,不容易被误用;后面有一系列的做法。类的设计,讲的是类设计犹如新类型type的设计。在设计类时要考虑的一系列问题。...
  • KangRoger
  • KangRoger
  • 2015年01月21日 21:43
  • 1317

C++简单实现八皇后问题

近来无聊,想着几年前用c#实现的八皇后,是参考网上的答案,如今过了几年,想试试有没进步,用c++简单地实现。 八皇后问题,是回溯算法的经典例子,它的规则要求是同一行同一列同一条斜线不能有两个皇后,不然...
  • xanxus46
  • xanxus46
  • 2014年03月21日 16:35
  • 6549

C++之基本数据类型转换和转换函数

C++语言中类型转换有两种:隐式转换和强制转换。在类型转换的过程中还有保值转换和非保值转换之分。保值转换是安全的,数据精度不会受到损失,如数据类型有低向高转换;非保值转换是不安全的,数据精度会受到损失...
  • erlian1992
  • erlian1992
  • 2015年02月04日 16:35
  • 1334

[c++基础] 类的四个基本函数

1.面向对象的基本概念 所谓面向过程的编程思想,就是分析解决问题的步骤,将这些步骤用一个个函数实现,最后一个个调用。 所谓面向对象的编程思想,就是将任何事物都看成一个对象,对象有各种属性(att...
  • qq_26304333
  • qq_26304333
  • 2017年03月17日 16:17
  • 395

跟着正哥0基础学C++——开始篇

要学习一门编程语言,首先要有一本适合的书本(当然这里指的是电子版,现在这个社会拿着纸质版的书籍学习知识的人越来越少了,不是不想,而是没那个条件,最近我也是买了三本心理书在办公室,中午休息的时候,或者下...
  • lionel_ran
  • lionel_ran
  • 2015年09月25日 22:42
  • 564
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:遭遇C++基础问题 [2004年5月29日 18:33 ]
举报原因:
原因补充:

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