第九课、C++继承
封装:提高代码维护性 (遇到问题能够准确定位)。
继承:提高代码复用性(非ctrl+c ctrl+v,而是不做任何修改或操作源码就能实现代码的复用)。
多态:提高代码扩展性。
2、继承描述:(以下方示例2为例说明)
(1)A类是B类的父类,B是A的子类。
(2)A类是B类的基类,B类是A的派生类。
(3)继承的过程可视为拷贝。
3、继承语法声明:
4、复用方法(继承:提高代码复用性):(1)组合---has-a(2)继承---is-a
(1)组合(将一个类作为另一个类的对象成员)示例:
class A
{
public:
void print()
{
cout << "hello world" <<endl;
}
}
};
class B
{
public:
A a; //组合
void func()
{
a.print();
}
}
};
(2)继承示例:
class A{…..};
class B : public A
{
public:
int m_num;
int count;
void func()
{
print();
}
};
一、继承规则
常用public,protected/private一般用不到
二、派生类
派生类:
派生类实例化的对象大小 = 父类的对象大小 + 派生类的新成员大小。
覆盖:派生类拥有与基类相同的属性(成员变量)或方法(函数)时,派生类产生覆盖。
注:覆盖又称遮蔽(下面有详解)。
1、派生类的构造函数(执行顺序)
(1)基类继承而来的成员的初始化工作还是由基类构造函数完成,派生类新增的成员在派生类的构造函数中初始化。若基类没有无参构造函数,那么派生类里所有构造函数都要显示调用基类的构造函数。
示例:
class A
{
public:
A()
{
cout << "A" << endl;
}
explicit A(int num) : m_num(num)
{
cout << "A int" << endl;
}
~A()
{
cout << "~A" << endl;
}
int m_num;
};
class B : public A
{
public:
B() : A()
{
cout << "B" << endl;
}
B(int count) : m_count(count),A(5)
{
cout << "B int" << endl;
}
int m_count;
};
(2)构造函数调用顺序:
基类(继承声明的顺序决定) -> 子对象(定义的顺序觉定)-> 派生类
例如:继承声明:class B : public C,public A
定义顺序:Test t;
Test2 t2;
(析构函数与此相反)
(1)基类中没有默认构造函数(或无参),那么在派生类的构造函数中必须显示调用基类构造函数,以初始化基类成员。
(2)调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左到右)。
(3)调用内嵌成员对象的构造函数,调用顺序按照它们在类中声明的顺序。
2、派生类成员函数
(1)函数重载
(2)函数遮蔽(覆盖)
①派生类成员函数与基类成员函数一摸一样,默认调用派生类的方法。
②解决方法:通过派生类对象访问基类的同名函数 对象名.基类名::函数名。
示例:b.A::print(); //前提:B b; B是A的派生类,AB中均匀有void print()函数