一、基本概念
1、类的继承,是新的类从已有类那里得到已有的特性。或从已有类产生新类的过程就是类的派生。原有的类称为基类或父类,产生的新类称为派生类或子类。
2、派生类的声明:
class 派生类名:继承方式 基类名1, 继承方式 基类名2,...,继承方式 基类名n
{
派生类成员声明;
};
3、一个派生类可以同时有多个基类,这种情况称为多重继承,派生类只有一个基类,称为单继承。直接派生,间接派生。
4、继承方式规定了如何访问基类继承的成员。继承方式有public, private, protected。如果不显示给出继承方式,默认为private继承。继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限。
5、派生类继承基类中除构造和析构函数以外的所有成员。
6、派生类生成:
吸收基类成员(除构造析构函数以外的所有成员);
改造基类成员(根据继承方式调整基类成员的访问,函数在子类中的覆盖,以及虚函数在子类中的覆盖);
添加新的成员;
7、公有继承
当类的继承方式为公有继承时,基类的公有和保护成员的访问属性在派生类中不变,而基类的私有成员不可访问。即基类的公有成员和保护成员被继承到派生类中仍作为派生类的公有成员和保护成员。派生类的其他成员可以直接访问它们。无论派生类的成员还是派生类的对象都无法访问基类的私有成员。
8、私有继承
当类的继承方式为私有继承时,基类中的公有成员和保护成员都以私有成员身份出现在派生类中,而基类的私有成员在派生类中不可访问。基类的公有成员和保护成员被继承后作为派生类的私有成员,派生类的其他成员可以直接访问它们,但是在类外部通过派生类的对象无法访问。无论是派生类的成员还是通过派生类的对象,都无法访问从基类继承的私有成员。通过多次私有继承后,对于基类的成员都会成为不可访问。因此私有继承比较少用。
9、保护继承
保护继承中,基类的公有成员和私有成员都以保护成员的身份出现在派生类中,而基类的私有成员不可访问。派生类的其他成员可以直接访问从基类继承来的公有和保护成员,但是类外部通过派生类的对象无法访问它们,无论派生类的成员还是派生类的对象,都无法访问基类的私有成员。
二、派生类的构造函数和析构函数
1、派生类中由基类继承而来的成员的初始化工作还是由基类的构造函数完成,然后派生类中新增的成员在派生类的构造函数中初始化。
2、派生类构造函数的语法:
派生类名::派生类名(参数总表):基类名1(参数表1),基类名(参数名2)....基类名n(参数名n),内嵌子对象1(参数表1),内嵌子对象2(参数表2)....内嵌子对象n(参数表n)
{
派生类新增成员的初始化语句;
}
注:构造函数的初始化顺序并不以上面的顺序进行,而是根据声明的顺序初始化。
3、如果基类中没有不带参数的构造函数,那么在派生类的构造函数中必须调用基类构造函数,以初始化基类成员。
4、派生类构造函数执行的次序:
调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左到右);
调用内嵌成员对象的构造函数,调用顺序按照它们在类中声明的顺序;
派生类的构造函数体中的内容。
例子:
- #include <iostream>
- #include <time.h>
- using namespace std;
- class B1
- {
- public:
- B1(int i)
- {
- cout<<"constructing B1 "<<i<<endl;
- }
- };
- class B2
- {
- public:
- B2(int j)
- {
- cout<<"constructing B2 "<<j<<endl;
- }
- };
- class B3
- {
- public:
- B3()
- {
- cout<<"constructing B3"<<endl;
- }
- };
- class C: public B2, public B1, public B3
- {
- public:
- C(int a, int b, int c, int d):B1(a), memberB2(d), memberB1(c),B2(b)
- {
- }
- private:
- B1 memberB1;
- B2 memberB2;
- B3 memberB3;
- };
- int main()
- {
- C obj(1,2,3,4);
- return 0;
- }
输出结果为:
constructing B2 2
constructing B1 1
constructing B3
constructing B1 3
constructing B2 4
constructing B3
5、析构函数
派生类的析构函数的功能是在该对象消亡之前进行一些必要的清理工作,析构函数没有类型,也没有参数。析构函数的执行顺序与构造函数相反。
例子:
- #include <iostream>
- #include <time.h>
- using namespace std;
- class B1
- {
- public:
- B1(int i)
- {
- cout<<"constructing B1 "<<i<<endl;
- }
- ~B1()
- {
- cout<<"destructing B1"<<endl;
- }
- };
- class B2
- {
- public:
- B2(int j)
- {
- cout<<"constructing B2 "<<j<<endl;
- }
- ~B2()
- {
- cout<<"destructing B2"<<endl;
- }
- };
- class B3
- {
- public:
- B3()
- {
- cout<<"constructing B3"<<endl;
- }
- ~B3()
- {
- cout<<"destructing B3"<<endl;
- }
- };
- class C: public B2, public B1, public B3
- {
- public:
- C(int a, int b, int c, int d):B1(a), memberB2(d), memberB1(c),B2(b)
- {
- }
- private:
- B1 memberB1;
- B2 memberB2;
- B3 memberB3;
- };
- int main()
- {
- C obj(1,2,3,4);
- return 0;
- }
输出结果为:
B0::display()
B0::display()
B0::display()
通过这种赋值兼容后,每次调用的同名函数都是基类的同名函数,如果想调用派生类的,则需要使用虚函数。
阅读(2322) | 评论(0) | 转发(0) |