继承的作用:
将父类中非保护权限的方法和属性(函数和变量)拷贝至子类(可以简单这么理解,因为有重写和虚函数指针这种东西不好理解,后面的博文会另外介绍)
继承的基本语法:
class 子类名 : 继承方式(权限) 基类名(父类名)
{
}
简单的实现和测试:
class BasePage
{
public:
void header()
{
cout << "基础框架" << endl;
}
};
class FuncFragment : public BasePage
{
public:
void content()
{
cout << "正文" << endl;
}
};
void test5()
{
FuncFragment().header(); //这里访问的是子类继承过来的方法,不是父类的方法
FuncFragment().content();
}
注意:
- class中的默认权限为private
- 父类中的private(私有)成员在子类中无法使用(被继承过去了,也占用空间,但是被隐藏了,无法访问)。
不同继承方式继承带来的区别:
- public: 父类中所有public成员在子类中为public属性,父类中所有protected成员在子类中为protected属性
- protected: 父类中所有public成员和protected成员,在子类中为protected属性
- private: 父类中所有public成员和protected成员,在子类中为private属性
关于虚继承:
有一个基本类: 动物类
两个子类: 羊类, 骆驼类
一个孙子类(没有孙子类): 羊驼类
- 当羊类,和驼类继承动物类;羊驼类继承羊类和驼类
会导致动物类被羊驼类多次继承(菱形继承)
为了避免这种情况,就有了虚继承的出现 - 虚继承:可以理解为共享数据(或者理解为复制地址),在子类中更改虚继承的数据时,虚基类中对应的值也会被更改
class Animal //虚基类
{
public:
Animal(){
len = 10;
};
int len;
};
class Sheep : virtual public Animal
{
};
C
class Camel: virtual public Animal
{
};
class CNM : public Sheep, public Camel
{
};
//菱形继承问题:
void test2()
{
CNM sun;
cout << sun.len << endl;
cout << CNM().Sheep::len << endl;
}
来看一下这时的内存分部:
上图显示,此时羊驼类占12字节
羊类(一个虚指针)占4字节
骆驼类(一个虚指针)占4字节
动物类(一个虚基类)占4字节