一、继承
1.C++的继承
继承有3种形式:私有继承、保护继承、公有继承,缺省的继承方式是私有继承。
不论哪种继承方式,派生类都是显示的继承类基的保护成员变量和函数和公有成员变量和函数,继承方式只是限定在派生类中这两种成员变量的访问方式(即访问权限)。私有的成员变量和函数也被继承到派生类中,但是不能被访问,它是隐藏的,在派生类中不可见。
派生类继承基类,除基类的构造函数和析构函数不外,其他的所有都继承。
继承是“is-a”的关系。派生类是基类的一种,例如:学生继承与人,学生是人的一种,但人不一定都是学生。
私有继承:将基类保护和公有的成员变量作为派生类的私有变量,不能在类外访问;
保护继承:将基类保护和公有的成员变量作为派生类的保护变量,不能在类外访问但是可以被继承;
公有继承:将基类保护和公有的成员变量作为派生类的公有变量,可以在类外访问。
注意:派生类中可以定义和基类同名的成员变量,因为有类的作用域的限定(Base::a Derive::a)
class Base
{
public:
Base(int date):_ma(data) {}
~Base() {}
private:
int _ma;
};
class Derive : public Base
{
public:
Derive(int data1, int data2):Base(data1),_mb(data2) { }
~Derive() {};
};
在派生类的构造函数的初始化成员列表中显示的调用基类的构造函数,用基类的构造函数构造派生类中的基类部分。
2.派生类对象的构造/析构顺序
构造:构造基类成员对象–>构造基类–>构造派生类成员对象–>构造派生类
析构:析构派生类–>析构派生类的成员对象–>析构基类–>析构基类的成员对象
3.基类对象==>赋值给==>派生类对象 (X) 后面派生类的内存无法赋值
派生类对象==>赋值给==>基类对象 (V)将派生类中基类的部分赋值给基类对象
基类指针==>指向==>派生类对象 (V) 该指针智能访问从基类继承的那部分
派生类指针==>指向==>基类对象 (X) 可能非法访问内存
4.虚函数
如果派生类继承了有被vritual关键字修饰的函数的基类,被vritual修饰的函数称为虚函数。派生类可以重写该虚函数。如果派生类重写了该虚函数,那么派生类对象调用该方法时调用的就是派生类自己实现的方法。如果派生类没有重写该方法,则调用基类的方法。
class Base
{
public:
Base(int data):_ma(data) {}
~Base() {}
virtual void Show()//虚函数
{
cout<<"Base::Show()"<<endl;
}
private:
int _ma;
};
class Derive : public Base
{
public:
Derive(int data1, int data2):Base(data1),_mb(data2) { }
~Derive() {};
virtual void Show()//虚函数