继承的好处

减少重复代码
语法:【class 子类:继承方式 父类】

  • 子类——派生类
  • 父类——基类

继承方式

  • public: 父类中的public和protected成员属性不变,private的不可以访问
  • private:父类中的public和protected成员属性都变为private,private的不可以访问
  • protected:父类中的public和protected成员属性都变为protected,private的不可以访问

父类中所有的成员变量都会被子类继承, 只是私有成员会被隐藏起来

利用开发人员命令提示工具查看对象模型(vs studio):

  • 在项目路径下cl /dl reportSingleClassLayout类名 文件名

继承中构造和析构的顺序

  1. 父类构造
  2. 子类构造
  3. 子类析构
  4. 父类析构

同名成员处理方式

class Base{
public:
	Base(){
		int A=100;    
    }
};

class Son:public Base{
public:
	Son(){
    	A=100;
    }
    int A;
}

void test(){
	Son s;
    cout<<s.A<<endl;
    //输出100,为子类的成员变量
    cout<<s.Base::A<<endl;
    //输出200,为父类的成员变量
}

如果子类中出现和父类中同名的成员函数,父类中的同名成员函数会被隐藏,无法直接访问,需要访问父类需要加上作用域

同名静态成员处理方式

class Base{
public:
	static int a;
};
int Base::a=100;

class Son{
public:
	static int a;
}
int Son::a=200;

void test(){
	//1. 通过对象访问
	Son s;
    cout<<s.a<<endl;
    //输出200,访问的是子类
    cout<<s.Base::a<<endl;
    //输出100,父类
    
    //2.通过类名访问
    cout<<Son::a<<endl;
    //输出200
    cout<<Son::Base::a<<endl;
    //输出100,第一个::通过类名方式访问,第二个::访问父类作用域
}

多继承语法

(不建议使用)

class Base1{};
class Base2{};
class Son:public Base1, public Base2{};


菱形继承

定义:b和c均继承于类a,而类d同时继承于b和c

对于a中的属性,b和c中均有继承,因此d中会继承两次,出现二义性

解决方式:虚继承,在继承之前加上关键字virtual

class sheep :virtual public animal{};

虚继承以后,只有一份数据 alt

如图,sheepTuo中保存的是sheep和tuo类的虚基准指针,该指针指向虚基址表,通过当前位移加上虚基址表中保存的地址,可获得数据的地址