您的位置:首页 > 编程语言 > C语言/C++

【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是虚函数且我们是通过引用或指针进行的调用,则编译器产生的代码将在运行时确定到底运行该虚函数的哪个版本,依据是对象的动态类型;

反之,则编译器将产生一个常规函数调用

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,此时为覆盖,返回类型应该相同,除非返回类型是所在类类型.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: