一、封装
public
private
protected
二、继承
一个派生类继承了所有的基类方法,但下列情况除外:
-
基类的构造函数、析构函数和拷贝构造函数。
-
基类的重载运算符。
-
基类的友元函数。
继承类型
- 公有继承
当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。 - 保护继承
当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。 - 私有继承
当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。
父类中的访问权限 | 继承方式 | 子类中的访问权限 |
public | public | public |
private | no access | |
protected | protected | |
public | private | private |
private | no access | |
protected | private | |
public | protected | protected |
private | no access | |
protected | protected |
继承构造函数含有参数的父类
父类含有多个构造函数,子类构造函数的写法?
继承之后类的构造,析构顺序
三、多态
调用基类指针创建子类对象,那么基类应该有=虚析构函数==
虚函数
本质:由虚指针和虚表控制,虚指针指向虚表中的某个函数入口地址,就实现了多态,
作用:实现了多态,虚函数可以被子类重写,虚函数地址存储在虚表中
是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。
纯虚函数
基类中不定义只声明,子类中必须定义。
动态多态
重写
静态多态
模板和重载
四、友元
如果想在类外访问该类的私有成员,可以声明一个友元类,例如下面的类B是类A的友元类,在类B中可以访问类A的私有成员。
class A
{
private:
int n;
friend class B;
};
class B
{
void fun(A a) { int x = a.n; }
};
还有友元函数,也是通过声明一个友元函数,在类外达到访问类的私有成员的目的,和友元类写法一致。