【c++】面向对象程序设计之继承中的类作用域
2014-07-19 14:18
495 查看
当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内。
一个对象、引用或指针的静态类型决定了该对象的哪些成员是可见的。即使静态类型与动态类型可能不一致,但我们使用哪些成员仍然是由静态类型决定的。基类指针(引用)即使指向派生类对象,仍然不能通过该指针(引用)来访问派生类中定义的成员,即使是public。编译器通过静态类型来确定调用对象在内存中所占空间大小
原因:http://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3823950.html
名字查找与继承:(函数调用步骤)
假设调用p->mem()
1.首先确定p的静态类型
2.在p的静态类型对应的类中查找,如果找不到,则依次在直接基类中不断查找直至到达继承链的顶端,如果找遍了该类及其基类仍然找不到,编译器将报错
3.一旦找到mem,就进行常规的类型检查,以确认对于当前找到的mem,本次调用是否合法
4.假设调用合法,则编译器根据调用的是否是虚函数而产生不同的代码:
如果mem是虚函数且我们是通过引用或指针进行的调用,则编译器产生的代码将在运行时确定到底运行该虚函数的哪个版本,依据是对象的动态类型;
反之,则编译器将产生一个常规函数调用
输出a,a
-------------------------------------------------------------------------------------------------------
名字查找优于类型检查
如果派生类的成员与基类的某个成员同名,则派生类在其作用域内隐藏该基类成员,即使派生类成员与基类成员的形参列表不一致,基类成员也仍然被隐藏。
“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆),若有virtual,此时为覆盖,返回类型应该相同,除非返回类型是所在类类型.
一个对象、引用或指针的静态类型决定了该对象的哪些成员是可见的。即使静态类型与动态类型可能不一致,但我们使用哪些成员仍然是由静态类型决定的。基类指针(引用)即使指向派生类对象,仍然不能通过该指针(引用)来访问派生类中定义的成员,即使是public。编译器通过静态类型来确定调用对象在内存中所占空间大小
原因:http://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3823950.html
名字查找与继承:(函数调用步骤)
假设调用p->mem()
1.首先确定p的静态类型
2.在p的静态类型对应的类中查找,如果找不到,则依次在直接基类中不断查找直至到达继承链的顶端,如果找遍了该类及其基类仍然找不到,编译器将报错
3.一旦找到mem,就进行常规的类型检查,以确认对于当前找到的mem,本次调用是否合法
4.假设调用合法,则编译器根据调用的是否是虚函数而产生不同的代码:
如果mem是虚函数且我们是通过引用或指针进行的调用,则编译器产生的代码将在运行时确定到底运行该虚函数的哪个版本,依据是对象的动态类型;
反之,则编译器将产生一个常规函数调用
class A { public: void p() { cout << "a" << endl; } }; class B :public A { public: void p() { cout << "b" << endl; } }; void main() { A *a = new A; A *b = new B; a->p(); b->p(); delete a; delete b; }
输出a,a
-------------------------------------------------------------------------------------------------------
名字查找优于类型检查
如果派生类的成员与基类的某个成员同名,则派生类在其作用域内隐藏该基类成员,即使派生类成员与基类成员的形参列表不一致,基类成员也仍然被隐藏。
“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆),若有virtual,此时为覆盖,返回类型应该相同,除非返回类型是所在类类型.
相关文章推荐
- C++ 学习笔记(15)面向对象程序设计(类、继承、虚函数、抽象类、using命令、容器与继承)
- C++面向对象的程序设计——继承
- C++ Pirmer : 第十五章 : 面向对象程序设计之基类和派生的定义、类型转换与继承与虚函数
- 面向对象的程序设计(十一)继承的深入了解,了解他的作用
- 【c++】面向对象程序设计之访问控制与继承
- 面向对象与C++程序设计-类的继承与派生学习笔记
- 面向对象程序设计-------c++继承小结
- C++之面向对象程序设计的基本特点(抽象、封装、继承、多态)
- 【c++】面向对象程序设计之关于继承
- 面向对象的程序设计(六)组合继承
- C++面向对象笔记:继承、派生
- 面向对象程序设计——继承
- C++总结之继承和面向对象的设计
- 面向对象程序设计——继承访问机制
- 面向对象的程序设计(七)原型式继承
- javascript高级程序设计第六章:面向对象的程序设计——继承读书笔记
- JS Pro - 面向对象的程序设计 - 继承
- JavaScript 面向对象程序设计(下)——继承与多态
- 面向对象程序设计(C++)教学资源[2009]
- JavaScript 面向对象程序设计(下)——继承与多态