代码改变世界

VC编译器

2010-12-07 09:48  bingcaihuang  阅读(281)  评论(0)    收藏  举报

关键的问题是在MSDN上,仔细看一下MSDN上对CFrameWnd的说明,说明中只有两个成员变量m_bAutoMenuEnable和rectDefault,所以m_strTitle不会显示而上面的两个会显示,道理就在这里而与是否私有共有的无关,不信不装MSDN看还有没有列表弹出。

而编译时能通过,运行也没问题。查看MFC中CFrameWnd类的声明你会看到有成员变量m_strTitle,而编译是与MSDN无关的,只与你给的头文件和lib库有关,所以编译能通过。

为什么会这样,因为ms认为你一般没有必要操作此成员变量(事实也是如此),所以在MSDN中没有说,(就象有很多未公开的API一样)。

通过共有继承,派生类能访问基类的保护成员,想想看,如果不能那它跟私有成员还有什么区别。其实想一想,多数人都很少真正做类的继承(实际应用中确实需要,并且概念上分得比较清,就象人家作的类库一样),尤其少用保护成员,所以上面的概念很多人都不清楚,这很正常。  

还有VC6的编译器和别的编译器有些不同,而且和一般的C++书上讲的也有出入。一般书上会这样讲,通过继承不能提高基类成员的存取属性(依次是私有保护共有),照理说派生类不能提高基类的保护成员为共有属性,但VC6可以。  

如下示例代码  

  class  base  

  protected:  

  {

          int  m_value;  

  }  

  class  derive   :   public  base  

  {  

  }  

  int  main()  

  {         

          derive   d;  

          d.m_value   =   1;//此行编译运行在VC6下都没错误,但在Borland的编译器下编译不能通过  

  }  

这一点,不知大家注意了没有。一般地,为了新建类对象以及销毁类对象,可以吧构造和析构定义为public。