本周主要讲了
(1)Inheritance 继承
表示 is-a,代码 例如
class A
{ …};
class B: public A // 用public继承较多,A为父类,B为子类
{…};
继承与虚函数一起使用最有价值,构造由内到外,析构由外到内。
base class 的 dtor 必须为 virtual , 否则会出现 undefined behavior。
(2)Composition 复合
表示 has-a,代码 例如
class Student
{
private:
string name;
valarray<double> scores; //Student类,包含valarray类的成员。
…
};
复合构造由内而外,析构由外而内。
(3)Delegation 委托
Composition by reference. 代码 例如
Class A
{
private:
B* refb; // 用指针指向B类
};
A与B类不会同时创建,需要B类时才会创建。
(4)virtual function 虚函数
non-virtual函数:你不希望子类重新定义(override,复写)它。
virtual函数:你希望子类重新定义,并且你对它已有默认定义。
//用virtual去修饰成员函数即可使其成为虚函数
pure virtual函数:你希望子类一定要重新定义,你对它没有定义。
virtual void draw() const =0;
//纯虚函数子类必须全部定义后,父类才可以new。
//父类的析构函数必须为virtual。
//如果要想实现动态多态则必须使用虚函数
//普通函数不能是虚函数,也就是说这个函数必须是某一个类的成员函数,不可以是一个全局函数,否则会导致编译错误。
//静态成员函数不能是虚函数 static成员函数是和类同生共处的,他不属于任何对象,使用virtual也将导致错误。
//内联函数不能是虚函数 如果修饰内联函数 如果内联函数被virtual修饰,计算机会忽略inline使它变成存粹的虚函数。
//构造函数不能是虚函数,否则会出现编译错误。