访问控制符

Untitled

三种继承的差异

Untitled

子类如何使用基类的构造函数

子类是无法直接继承基类的构造函数的

子类调用基类构造函数的方法是将积累的构造函数放在子类构造函数的初值列,不能放在子类构造函数的函数体中,这样会出错

Untitled

原因是当父类的构造函数被放在子类的构造函数的函数体中时,它被编译器理解为了一般的函数调用

如图:第二次调用构造函数传递的this指针是一个栈变量,只在当前函数有效

这个例子还反映了另外两个问题:

  1. 构造函数的初值列与函数体中的语句有不同的实现方式,它们属于两个层级,初值列的语句具有更加深远的影响,不仅仅是体现在语句的顺序上
  2. 从本质上来看,构造函数也是普通函数,构造函数是在特定上下文中的普通函数的另类实现,这个实现并没有改变构造函数仍然是普通函数的实质,只是当编译器识别出一个普通函数是构造函数时,会有更复杂的实现(或许所有的特殊函数都是这样实现的)

运算符重载

Untitled

注意:运算符重载与函数重载可以同时发生

int operator+(class A& a, class A& b);
int operator+(class A& a, int b);

以上两个操作符重载可以同时发生,操作符重载其实就是在定义函数,函数的名称就叫operator+(指以上例子中)

虚函数和纯虚函数

在一个函数前加上virtual关键字,这个函数就变成了虚函数,虚函数可以被子类重写