继承
面向对象的三大特征:封装、继承、多态
封装较为简单,就是把客观事物封装成抽象的类,并且类可以把自己的属性和行为只让可信的类或者对象操作,对不可信的进行信息隐藏。前面我们一直在用封装。
本文所讲的继承,可以使用已存在类的所有功能,并在无需重写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”。被继承的类称为“基类”、“父类”或“超类”。
继承的过程,就是从一般到特殊的过程。
语法如下:
类A继承类B的所有特征 - class A:public B
A类就是上述所说的子类、派生类 - 一部分是从基类继承过来的,一部分是自己增加的成员;
B类为父类、基类。
先创建一个基类:
class BasePage
{
public:
void header()
{
cout << "标题栏" << endl;
}
};
倘若我们需要创建其他类,需要用到基类的内容,则采用继承的方式。下面代码创建了Java和CPP两种子类来继承基类,这样这两个子类就得到了基类的所有属性和行为:
class Java:public BasePage
{
public:
void content()
{
cout << "Java内容" << endl;
}
};
class CPP :public BasePage
{
public:
void content()
{
cout << "CPP内容" << endl;
}
};
创建一个test函数进行打印,两个子类创建的对象都能使用基类的内容:
void test01()
{
//页面打印
cout << "Java:" << endl;
Java ja;
ja.header();
ja.content();
cout << "CPP:" << endl;
Java cpp;
cpp.header();
cpp.content();
}
这,就是继承。
我们也注意到在继承的时候,用到了public,跟类中的权限一样,也有public公共继承、protected保护继承和private私有继承三种访问权限:
父类中是private时,子类三种继承方式都不可使用;
子类为public继承时,父类中除private外,都按原来的方式继承;
子类为protected继承时,父类中除private外,都按protected的方式继承;
子类为private继承时,父类中除private外,都按private的方式继承。
好乱感觉,看文字不好理解,做个例子:
先创建一个基类,分别在三种权限下定义变量:
class base
{
public:
int m_A;
protected:
int m_B;
private:
int m_C;
};
然后按不同的继承权限创建三个子类如下:
class son1 :public base
{
public:
void func()
{
m_A = 10;
m_B = 20;
m_C = 30;//err
}
};
class son2 :protected