c/c++程序员面试宝典-继承时的类作用域
每个类都保持着自己的作用域,在该作用域中定义了成员的名字。在继承情况下,派生类的作用域嵌套类作用域中。如果不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义。
面试题110 什么时候发生函数覆盖****
分析:覆盖是指派生类中如果存在重新定义的函数。其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致。覆盖函数和被覆盖函数只有函数体不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本。
覆盖的特征为在不同的范围中(分别位于派生类与基类)的函数,函数名字相同,函数参数相同,基类函数必须有virtual关键字。覆盖的示例代码如下:
#include<iostream.h>
class Base //定义基类
{
public:
virtual void q(void)
{cout<<"Base::q(void)"<<endl;}
};
class Derived : public Base //定义派生类
{
public:
virtuai void q(void)
{cout<<"Derived::q(void)"<<endl;}
};
void main()
{
Derived d;
Base *pb=&d;
pb->q(); //运行结果 Derived::q(void)
}
上面代码中,虚函数Base::q(void)被Derived::q(void)覆盖。从而在子类中产生一个新的函数。
【答案】覆盖在继承时派生类对于抽象类或者接口声明的方法的具体实现时使用。
面试题111 如何访问基类成员***
分析:有两种因素同时控制了派生类对基类成员的访问权限。这两个因素就是基类中类成员的访问说明符和派生类的派生方式。在任何派生方式下,基类的私有成员都是派生类不可访问成员。在保护派生情况下,除私有成员外均被派生类以保护成员方式所继承,公有派生时不改变基类公有和保护成员的访问权限。
使用class保留字定义的派生类默认具有Private继承,而用struct保留字定义的类默认具有public继承。
一个访问基类成员的示例代码如下:
class Derive;
class Base //定义基类
{
friend Derive;
public:
void testa();
void testb(); //定义基类方法
protected:
int _numble;
string _name;
static float _f;
};
class Derive: public Base //定义派生类
{
public:
void testb(int);
using Base :: testb; //访问基类
void testc();
protected:
string _numble;
}
注意:在派生类中直接访问基类成员有一个例外,当基类成员名在派生类中被重用时,为了用已经被派生类重用的名字来访问基类的成员,编程者必须用它的类域操作符限定修饰基类的成员。
【答案】派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的Private成员。通过派生类的对象只能访问基类的public成员。