继承的概念与定义
继承概念:继承机制是面向对象设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生的新类,称为派生类。
#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、protected、private
三种继承方式之间的区别:基类中不同权限的成员在子类中的权限。
- public
基类中被public和protected修饰的成员,在子类中的权限不变。 基类中被private修饰的成员在子类中不能直接被访问||不可见,但已被继承。
- protected
基类中被public修饰的成员在子类中的权限降为protected。 基类中被protected修饰的成员在子类中的权限不变。 基类中被private修饰的成员在子类中不能直接被访问||不可见,但已被继承。
- private
基类中被public和protected修饰的成员,在子类中的权限降为private。 基类中被private修饰的成员在子类中不能直接被访问||不可见,但已被继承。
基类和派生类对象赋值转换
- 可以将子类对象直接赋值给基类对象。
- 可以让基类的指针或者引用直接指向子类的对象。
继承中的作用域
- 在继承体系中基类和派生类都有独立的作用域。
- 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况较隐藏,也叫重定义。(在子类成员函数中,可以使用 基类::基类成员 显示访问)
- 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。
派生类的默认成员函数
- 如果基类没有定义构造函数或者基类具有默认的构造函数(无参的和全缺省的构造函数)
如果基类具有无参的构造函数时,派生类必须显示定义自己的构造函数,并且必须在其初始化列表的位置显式调用基类的构造函数,完成派生类对象中基类部分成员的初始化。-派生类可以不用定义 -如果派生类需要做其他事情,将自己的构造函数显示给出就行
-
如果基类没有显示定义自己的拷贝构造函数,派生类是否定义都可以
如果基类显示定义自己的拷贝构造函数,派生类必须显示定义拷贝构造函数,并且需要在其拷贝构造初始化列表的位置显示调用基类的拷贝构造函数。
-
没有涉及到管理时:如果派生类没有显示定义自己的赋值运算符重载,编译器会生成一份默认的。该默认的赋值运算符重载可以完整的赋值。
如果类中涉及到资源管理:派生类需要将自己的拷贝构造函数显示给出,必须在其内部显示调用基类的赋值运算符重载完成基类部分的赋值,再完成自己特有的成员赋值。
-
派生类对象:基类部分+派生类部分
派生类的析构函数会在被调用完后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。
- 派生类对象初始化先调用基类的构造再调用派生类构造
- 派生类对象析构清理先调用派生类析构再调用基类析构