继承简单知识点
一:
1: 继承:在已有类的基础上创建新类的过程。
2:一个 B 类继承A类,或称从类 A 派生类 B。类 A 称为基类(父类),类 B 称为派生类(子类)
3:类继承关系的语法形式
class 派生类名 : 基类名表
{
数据成员和成员函数声明
};
4:不论种方式继承基类,派生类都不能直接使用基类的私有成员 。
5:派生类的生成过程:
①:吸收基类成员(全部吸收(构造、析构除外),但不一定可见)
在C++的继承机制中,派生类吸收基类中除构造函数和析构函数之外的全部成员。
②:改造基类成员
通过在派生类中定义同名成员(包括成员函数和数据成员)来屏蔽(隐藏)在派生类中不起作用的部分基类成员。
3:添加派生类新成员
仅仅继承基类的成员是不够的,需要在派生类中添加新成员,以保证派生类自身特殊属性和行为的实现。
6:简单运用
#include<iostream>
using namespace std ;
class A
{ public :
void get_XY() { cout << "Enter two numbers of x, y : " ; cin >> x >> y ; }
void put_XY() { cout << "x = "<< x << ", y = " << y << '\n' ; }
protected: int x, y ;
};
class B : public A
{ public :
int get_S() { return s ; };
void make_S() { s = x * y ; }; // 使用基类数据成员x,y
protected: int s;
};
class C : public B
{ public :
void get_H() { cout << "Enter a number of h : " ; cin >> h ; }
int get_V() { return v ; }
void make_V() { make_S(); v = get_S() * h ; } // 使用基类成员函数
protected: int h, v;
};
int main()
{ A objA ;
B objB ;
C objC ;
cout << "It is object_A :\n" ;
objA.get_XY() ;
objA.put_XY() ;
cout << "It is object_B :\n" ;
objB.get_XY() ;
objB.make_S() ;
cout << "S = " << objB.get_S() << endl ;
cout << "It is object_C :\n" ;
objC.get_XY() ;
objC.get_H();
objC.make_V() ;
cout << "V = " << objC.get_V() << endl ;
}
7:重名成员:
①:派生类定义了与基类同名的成员,在派生类中访问同名成员时屏蔽(hide)了基类的同名成员
②:在派生类中使用基类的同名成员,显式地使用类名限定符:
类名 :: 成员
8:派生类中访问静态成员
①:基类定义的静态成员,将被所有派生类共享(基类和派生类共享基类中的静态成员)
②:根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质
3:派生类中访问静态成员,用以下形式显式说明:
类名 :: 成员
或通过对象访问 对象名 . 成员
9:基类的初始化
①:在创建派生类对象时用指定参数调用基类的构造函数来初始化派生类继承基类的数据
②: 派生类构造函数声明为
派生类构造函数 ( 变元表 ) : 基类 ( 变元表 ) , 对象成员1( 变元表 )
… 对象成员n ( 变元表 ) ;
构造函数执行顺序:基类->对象成员->派生类
10:派生类构造函数和析构函数的使用原则:
Ⅰ:基类的构造函数和析构函数不能被继承
Ⅱ:如果基类没有定义构造函数或有无参的构造函数, 派生类也可以不用定义构造函数
三:如果基类无无参的构造函数,派生类必须定义构造函数
Ⅳ:如果派生类的基类也是派生类,则每个派生类只负责直接基类的构造
伍:派生类是否定义析构函数与所属的基类无关
11:派生类的数据成员既包括基类的数据成员,也包括派生类新增数据成员。
12:派生类析构函数
当派生类中不含对象成员时
●在创建派生类对象时,构造函数的执行顺序是:基类的构造函数→派生类的构造函数;
●在撤消派生类对象时,析构函数的执行顺序是:派生类的析构函数→基类的析构函数。
(2)当派生类中含有对象成员时
●在定义派生类对象时,构造函数的执行顺序:基类的构造函数→对象成员的构造函数→派生类的构造函数;
●在撤消派生类对象时,析构函数的执行顺序:派生类的析构函数→对象成员的析构函数→基类的析构函数。
13:多继承的派生类构造和访问
●多个基类的派生类构造函数可以用初始式调用基类构造函数初始化数据成员。
●执行顺序与单继承构造函数情况类似。多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序。
●一个派生类对象拥有多个直接或间接基类的成员。不同名成员访问不会出现二义性。如果不同的基类有同名成员,派生类对象访问时应该加以识别。
14:多继承的构造函数
派生类名(参数总表):基类名1(参数表1),基类名2(参数表2),…,基类名n(参数表n)
{
// 派生类新增成员的初始化语句
}
15:多继承方式下构造函数的执行顺序:
●先执行所有基类的构造函数
●再执行对象成员的构造函数
●最后执行派生类的构造函数
16:多继承的析构函数
●析构函数名同样与类名相同,无返回值、无参数,而且其定义方式与基类中的析构函数的定义方式完全相同。
●功能是在派生类中对新增的有关成员进行必要的清理工作。
●析构函数的执行顺序与多继承方式下构造函数的执行顺序完全相反,首先对派生类新增的数据成员进行清理,再对派生类对象成员进行清理,最后才对基类继承来的成员进行清理。