第01节:继承
回顾
面向对象的4个特点:
A(抽象) P(多态)I(继承)E(封装)
前两个单元:AE
本单元: PI
第02节:构造函数和析构函数
派生类继承的成员
派生类继承 ctor 和 dtor 吗?
派生类不继承的特殊函数
构造函数 (C++11已允许继承)
析构函数
作为特权地位的友元函数
赋值运算符函数
#include <iostream> struct A { A(int i) { } A(double d, int i) { } // ... }; struct B : A { using A::A; // 继承基类构造函数 int d{ 0 }; // 新的变量初始化方法 }; int main() { B b(1); // b.d 初始化为 0 }
Calling Base Class Constructors ( 调用基类构造函数)
Ctors of base class can only be invoked from the constructors of the derived classes. ( 基类构造函数只能由派生类构造函数调用)
The syntax to invoke it is as follows:
DerivedClass(parameterList) : BaseClass() { // Perform initialization } // Or DerivedClass(parameterList) : BaseClass(argumentList) { // Perform initialization }
No-Arg Constructor in Base Class( 基类的无参构造函数)
Rules for invoke constructors in derived class
A constructor in a derived class must always invoke a constructor in its base class. (派 生类构造函数必须调用基类构造函数)
If a base constructor is not invoked explicitly, the base class’s no-arg constructor is invoked by default. ( 若基类ctor未被显式调用,基类的无参构造函数就会被调用)
Constructor and Destructor Chaining ( 构造和析构函数链)
constructor chaining (构造函数链)
Constructing an instance of a class invokes all the base class along the inheritance chain. ( 构造类实例会沿着 继承链调用所有的基类ctor)
Invoke sequence: base first, derive next
destructor chaining (析构函数链)
Conversely, the destructors are automatically invoked in reverse order(dtor 与ctor正好相反)
Invoke sequence: derive first, base next
no-arg constructor ( 无参构造函数)
If a class is designed to be extended, provide a no-arg constructor. (若你的类 想被别人扩展,那么就提供一个无参构造函数)
34. 文件扩展名:头文件用.h,源文件用 .cpp (c++, cc也可)
35. A class should be declared in a header file and defined in a source file where the name of the files match the name of the class.
35. 类应该在头文件中声明并在源文件中定义,俩文件名字应 该与类名相同
例如:MyClass.h, MyClass.c++
例外的是,模板类的声明和定义都要放在头文件中
49. Class variables should never be declared public.
49. 类成员变量不可被声明为public
说明:公有变量违背了C++的信息隐藏原则。例外的是, 如果class只是一个数据结构,类似C语言中的struct,则 可将类变量声明为公有
#include <iostream> class Fruit { public: Fruit() { } Fruit(int id) { } std::string s; }; class Apple : public Fruit { public: Apple() :Fruit() { } }; int main() { Apple apple; }
第03节:函数重定义
第04节:多态和虚函数
第05节:访问控制 (可见性控制)
第06节:抽象类与纯虚函数
第07节:动态类型转换
第6单元作业【2】- 在线编程(难度:中)提交截止时间:2016年10月7日 23:30 / 待定提交阶段
第6单元作业【1】-在线编程(难度:易)提交截止时间:2016年10月7日 23:30 / 待定提交阶段