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。
浙公网安备 33010602011771号