继承概念:继承机制是面向对象设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生的新类,称为派生类。
#include <iostream> using namespace std; //基类 class Base { public: void SetBase(int b) { _b = b; } void PrintfBase() { cout << _b << endl; } public: int _b; }; //派生类 class Derived:public Base { public: int _d; }; int main() { //派生类继承了基类中的成员变量 cout << sizeof(Derived) << endl; //派生类继承了基类中的成员函数 Derived d; d.SetBase(10); d.PrintfBase(); system("pause"); return 0; }继承定义:
三种继承方式之间的区别:基类中不同权限的成员在子类中的权限。
public
基类中被public和protected修饰的成员,在子类中的权限不变。 基类中被private修饰的成员在子类中不能直接被访问||不可见,但已被继承。protected
基类中被public修饰的成员在子类中的权限降为protected。 基类中被protected修饰的成员在子类中的权限不变。 基类中被private修饰的成员在子类中不能直接被访问||不可见,但已被继承。private
基类中被public和protected修饰的成员,在子类中的权限降为private。 基类中被private修饰的成员在子类中不能直接被访问||不可见,但已被继承。如果基类没有定义构造函数或者基类具有默认的构造函数(无参的和全缺省的构造函数)
-派生类可以不用定义 -如果派生类需要做其他事情,将自己的构造函数显示给出就行如果基类具有无参的构造函数时,派生类必须显示定义自己的构造函数,并且必须在其初始化列表的位置显式调用基类的构造函数,完成派生类对象中基类部分成员的初始化。
如果基类没有显示定义自己的拷贝构造函数,派生类是否定义都可以 如果基类显示定义自己的拷贝构造函数,派生类必须显示定义拷贝构造函数,并且需要在其拷贝构造初始化列表的位置显示调用基类的拷贝构造函数。
没有涉及到管理时:如果派生类没有显示定义自己的赋值运算符重载,编译器会生成一份默认的。该默认的赋值运算符重载可以完整的赋值。 如果类中涉及到资源管理:派生类需要将自己的拷贝构造函数显示给出,必须在其内部显示调用基类的赋值运算符重载完成基类部分的赋值,再完成自己特有的成员赋值。
派生类对象:基类部分+派生类部分 派生类的析构函数会在被调用完后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。
派生类对象初始化先调用基类的构造再调用派生类构造
派生类对象析构清理先调用派生类析构再调用基类析构