覆盖
派生类可以定义一个和基类同名的成员,这叫做覆盖。
在派生类中访问这类成员的时候,缺省情况下将访问派生类中定义的成员;如果在派生类中访问基类定义的同名成员时,需要使用作用于符号::
一个实例:
class base{
int j;
public:
int i;
void func();
};
class derived:public base
{
public:
int i;
void access();
void func();
}
void derived::access(){
j = 5;//error,不能访问基类的私有成员
i = 5;//引用派生类中的i
base::i = 5;//基类(public)
func();//派生类中的函数
base::func();//基类中的函数
}
int main(){
derived obj;
obj.i = 1;
obj.base::i = 1;
}
嘿!你是不是在找说明?没有的,这只是个简单的例子罢了。
其实是有的嘿嘿。一般来说基类与派生类中不会定义同名的成员变量,大多数情况下,这是一个极蠢的做法;但同名成员函数是常见的事情。毕竟,覆盖,体现了派生类对从基类继承得到的特点的修改
类的保护成员
基类的protected成员,可以被基类(而非对象)的成员函数、基类的友元函数,以及派生类的成员函数可以访问当前对象的积累的保护成员。
进度有点慢了,就直接抄来了哈~~
一个实例:
派生类的构造函数
在创建派生类的对象时,需要首先调用基类的构造函数。在执行一个派生类的构造函数之前,总是先执行基类的构造函数。
关于调用基类构造函数的两种方式。
( i )显示方式:在派生类的构造函数中(的初始化列表中),为基类的构造函数提供参数。
如: derived::derived(arg_derived_list): base(arg_base_list)
( i i )隐式方式:在派生类的构造函数中,若省略基类构造函数时,则派生类的构造函数自动调用基类的默认构造函数。
当执行派生类的析构函数时,等执行完派生类的析构函数之后,自动调用基类的析构函数。
对于包含成员对象的派生类的构造函数的写法:
class Bug{
private:
int nLegs;
int nColor;
public:
int nType;
Bug( int legs, int color);
void PrintBug(){};
};
class Skill{
public:
Skill(int n){}
};
class FlyBug:public Bug//派生
{
int nWings;
Skill sk1,sk2;
public:
FlyBug(int legs, int color, int wings);
};
FlyBug::FlyBug(int legs, int color, int wings):
Bug(legs,color),sk1(5),sk2(color),nWings(wings) { }
在创建派生类的对象时:
(1)先执行基类的构造函数,用以初始化派生类对象中从基类继承的成员
(2)再执行成员对象类的构造函数,用以初始化派生类对象中的成员对象
(3)最后执行派生类自己的构造函数
在派生类对象消亡时:
(1)先执行派生类自己的析构函数
(2)再一次执行各成员对象类的析构函数
(3)最后执行基类的析构函数
析构函数的调用顺序与构造函数的调用顺序正好相反~