组合
- 组合就是把用户定义类的对象作为新类的数据成员
- 必须用初始化列表去初始化对象成员
继承
派生类构造
-
基类成员的初始化由基类的构造函数完成。派生类的构造函数调用基类的构造函数完成基类成员的初始化。
-
派生类构造函数可以隐式调用基类缺省的构造函数,也可以在派生类的构造函数的初始化列表显式地调用基类的构造函数。
-
也就是说,如果没有在派生类的构造函数中调用基类的构造函数,其实会调用缺省参数时调用的基类构造函数(带缺省值的构造函数
Base(int i = 1))
派生类析构
-
派生类的析构函数只析构自己新增的数据成员,基类成员的析构由基类的析构函数析构
-
派生类析构函数会自动调用基类的析构函数
-
派生类对象析构时,先执行派生类的析构函数,再执行基类的析构函数
赋值运算符重载
-
派生类不能继承基类的赋值运算
-
如果派生类没有定义赋值运算符重载函数:系统提供一个默认的赋值运算符重载函数,该函数对派生类中的基类对象调用基类的赋值运算符重载函数,对派生类新增数据成员相应赋值
-
若在派生类中重载赋值运算符:在重载函数中要显式调用基类的赋值运算符重载函数来对基类成员赋值
-
显示调用基类方法这里需要加域名限定
Base::operator=(tmp);
多态性
多态性
多态性:不同对象收到相同的消息时产生不同的动作。
实现:
- 函数重载(静态联编);
- 虚函数(动态联编)。
虚函数
-
虚函数的定义:在基类中用关键词
virtual
说明,并在派生类中重新定义的函数称为虚函数。在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数与参数类型的顺序都必须与基类中的原型完全相同。 -
虚函数是与基类指针指向派生类对象,或基类对象引用派生类对象结合起来实现多态性。
-
当基类指针指向派生类对象或基类对象引用派生类对象时,对基类指针或基类的虚函数,系统会到相应的派生类中对象调用寻找此虚函数的重定义。如找到,则执行派生类中的函数。如没有找到,则执行基类的虚函数。
-
在派生类中重新定义虚函数时,它的原型必须与基类中的虚函数完全相同。否则编译器会把它认为是重载函数,而不是虚函数的重定义。
-
派生类在对基类的虚函数重定义时,关键字
virtual
可以写也可以不写。不管virtual
写或者不写,该函数都被认为是虚函数。但最好是在重定义时写上virtual
。
虚析构函数
如果用基类指针指向派生类对象,那么在析构时,如果调用的是基类的析构函数,则会造成内存泄漏。因此,基类的析构函数应定义为虚函数。
将基类的析构函数定义为虚函数
纯虚函数
纯虚函数:是一个在基类中说明的虚函数,它在该基类中没有定义,但要在它的派生类里定义自己的版本,或重新说明为纯虚函数
virtual 类型 函数名 (参数表)=0
抽象类
抽象类:如果一个类中至少有一个纯虚函数,则该类被称为抽象类
抽象类使用说明:
-
抽象类只能作为其他类的基类,不能建立抽象类的对象
-
可以声明指向抽象类的指针或引用,此指针可指向它的派生类,进而实现多态性
-
抽象类不能用作参数类型、函数返回类型或显式转换类型
-
如果派生类中给出了基类所有纯虚函数的实现,则该派生类不再是抽象类,否则仍为抽象类
多继承与虚基类
略
网友评论