继承
继承是面向对象程序设计的重要特性,它允许我们在已有类的基础上构造出新的类,在原有的基础上进行更具体的定义,特性和功能。以原有类为基础产生新类可以说成是新类继承了原有类的特征也可以说从原有类派生出新的类。
一,因为派生类是基类的一种,所以任何基类对象的出现的地方都可以用公有派生类对象代替,这也是类型兼容向上原则,这种替代可以分为3种
1.派生类对象可以隐含转化为基类对象。
2.派生类对象可以初始化基类的引用。
3.派生类指针可以隐式转化为基类指针。
二,要注意
(1)如果是公有继承:基类的public成员是派生类的public成员,基类的protected成员是派生类的protected成员,基类的private成员是派生类,是不可访问的。
(2)如果是保护继承:基类的public和protected成员在派生类中是protected成员,基类的private成员在派生类中是不可被访问的。
(3)如果是私有继承:基类的public和protected成员在派生类中是private成员,基类的private成员在派生类中是不可访问的。
三,多重继承和多层继承的区别
多重继承
不仅可以从基类派生一个类,还可以从派生类派生一个类。
eg:class A{......}
class B : public A {.....}
class C : public B{.....} //类B派生基类A,类C派生自派生类B
多重继承
为一个派生类指定多个基类,这样的继承结构被称作多重继承
eg:class A {.....}
class B {......}
class C : public A , public B {....} //类C同时是类A和类B的子类
但如果派生类所继承的多个基类有相同的基类,而派生类对象需要调用这个先类的接口方法,容易出现错误
多态
编译时多态被称为静态联编,是指在程序编译时就可以确定的多态性,通过重载机制实现
运行时多态被称为动态联编,是指必须在运行中才能确定的多态性,通过继承和虚函数是来实现
多态的前提是必须存在继承和实现的关系
要注意
1.子父类存在同名的成员变量时,访问的是父类的成员变量
2.子父类存在同名的非静态的成员函数时,访问的是子类的成员函数
3.子父类存在同名的静态的成员函数时,访问的是父类的成员函数,不能访问子类特有的成员
虚函数
对于虚函数要注意,如果一个函数在基类中被声明为virtual,那么在所有的派生类中它都是virtual,也就是说虚函数具有继承性,但为了程序的可读所以在派生类中再次使用virtual声明。并且virtual只对函数声明有意义,在函数定义时,不能再次使用。
虚函数必须是non-static成员函数
eg:class Circle
{
public : virtual double area ( )
};
而且关键字virtual不能在类声明之外使用。在定义一个非内联成员函数时,使用关键字virtual是错误的
eg:class b {
public:
virtual void mf ( ): //正确的
};
virtual viod b::mf ( ) //错误
{....};
使用多态的好处可以减少函数的数量,在继承关系中可以把不同的子类对象都当做父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,并且不必为每个派生类编写功能调用,只需要对抽象基类进行处理,极大地提高了程序的可复用性,派生类的功能可以被基类的方法或者引用变量所调用这被称为向下兼容。