继承机制是面向对象程序设计使代码可以复用的最重要手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类称为派生类。
继承呈现了面向对象程序设计的层次结构,体现了由简单都复杂的认识过程。
多态性是考虑在不同层次的类中,以及在同一类中,同名的成员函数之间的关系问题。函数的重载,运算符的重载,属于编译时的多态性。以虚基类为基础的运行时的多态性是面向对象程序设计的标志性特征。体现了类推和比喻的思想方法。
c++通过类派生的机制来支持继承。被继承的类称为基类或超类,新产生的类为派生类或子类。
基类和派生类的集合称为类继承层次结构。
如果基类和派生类共享相同的公有接口,则派生类被称作基类的子类型。
派生反映了事务之间的联系,事务的共性与个性之间的关系。派生与独立设计若干相关的类,前者工作量少,独立的部分可以从基类继承来,不需要单独编程。
如果一个派生类同时可以有多个基类,称为多重继承,这时的派生类同时得到了多个已有类的特征。一个派生类只有一个直接基类的情况称为单一继承。
c++中的继承方式有三种:公有继承(public),私有继承(private),保护继承(protected)。
public:公有继承方式表示的是“是一个”的关系,比如说学生继承了人这个类的话,可以说:学生是一个人,但人不一定是学生。
下面我们通过这段代码画出两个类的内存空间分布:
class Object
{
public:
Object(int x = 0) :value(x)
{
cout << "create object" << this << endl;
}
~Object()
{
cout << "Destroy object" << this << endl;
}
private:
int value;
protected:
int oa;
public:
int ob;
};
class Base :public Object
{
private:
int ix;
protected:
int ia;
public:
int ib;
public:
Base(int x = 0) :ix(x), Object(x + 10)
{
cout << "Create base" << this << endl;
}
~Base()
{
cout << "destroy" << this << endl;
}
};
int main()
{
Object obj;
Base base1;
return 0;
}
在上面这段代码中,Object这个类是基类,Base这个类以公有方式继承了Object这个类,所以Base这个类是派生类。
我们可以通过这小段代码大致画出这两个类的内存分布如下所示:
当Base以公有方式继承Object这个类时,Base可以访问它自己的所有成员,可以访问基类中的公有成员和保护成员,不可以访问其基类中的私有成员。如下图所示:
当Base以私有方式继承Object这个类时,Base可以访问它自己的所有成员,也可以访问基类中的公有成员和保护成员,但是不可以访问其基类中的私有成员。(由于Base可以访问自己的私有成员,而Object这个隐藏的对象也是Base这个类的私有成员,因此它也可以访问Object中的公有成员和保护成员)如下图所示:
不可以访问成员对象里面的私有和保护属性,可以访问继承来的保护和公有。也就是说在继承方式中保护继承和公有继承可以等同,但是一个对象不能访问别的对象成员里面的私有和保护成员属性,只能访问公有的成员属性。