面向对象编程基于三个基本概念:数据抽象、继承和动态绑定。在C++中,数据抽象和动态绑定也被称为类和多态,也就是说C++中的数据抽象通过类实现,而动态绑定主要是为了实现多态。
面向对象编程的关键思想是多态性(polymorphism),在C++中,多态性仅用于通过继承而相关联的类型的引用或指针。
(1)公有继承、保护继承和私有继承
通过继承,派生类可以继承基类定义的成员,同时也可以重新定义那些与派生类型相关的成员函数,将函数特化;派生类也可以定义自己的成员变量和成员函数以实现更多的特性。
派生类继承基类的基本形式如下:
class derivedClass : access-label baseClass { ... };
在继承体系中,派生类和普通用户一样只能访问基类的public成员而不能访问private成员,private成员只能由类的成员和友元访问。但有的时候基类希望它的某些成员可以被派生类访问但不能被其他普通用户访问,此时可以使用访问控制标号protected实现:protected成员可以被派生类对象访问但不能被该类型的普通用户访问。
上面代码中的access-label指访问控制标号,它表示派生类从基类继承的成员在派生类中的访问权限,包含三种形式:
a. public继承 基类的public和protected成员成为派生类的public和protected成员;
b. protected继承 基类的public和protected成员变成派生类的protected成员,派生类外也不能直接使用基类的public成员;
c. private继承 基类的public和protected成员成为派生类的private成员。
class的默认继承级别为private,struct的默认继承级别为public:
class Base{...}; struct D1 : Base {...};//默认为public继承 class D2 : Base {...};//默认为private继承
(2)派生类对象包含基类对象作为子对象
派生类对象由多个部分组成:派生类本身定义的成员加上由基类成员组成的子对象,例如如果类Bulk_Item继承自Item_Base,那么Bulk_Item组成如下:
Bulk_Item对象:
Item_Base成员 |
Bulk_Item成员 |
每个派生类对象都有基类部分,可以访问基类的public和protected成员,就好像那些成员是派生类自己的成员一样。
派生类也可以作基类,最底层的派生类继承基类的成员,而基类又继承其自己的基类的成员,如此沿着继承链依次向上,最终的结果是最底层的派生类对象包含其每个直接基类和间接基类的子对象。
(3)继承与友元
基类或派生类可以使其他类或函数成为友元,友元可以访问类的private和protected成员。
但是友元关系不能继承,基类的友元对派生类的成员没有特殊访问权限,如果该友元希望能访问派生类的私有成员,那么必须显示的将其也声明为派生类的友元。如下所示:
1 class Base 2 { 3 friend class Frnd; 4 protected: 5 int i; 6 }; 7 8 class Derived:public Base 9 { 10 protected: 11 int j; 12 }; 13 14 class Frnd 15 { 16 public: 17 int mem(Base b) { return b.i;}//ok Frnd is friend to Base 18 int mem2(Derived d) { return d.i;}//error friendship doesn't inherit};
(4)继承与静态成员
如果基类定义了static成员,则整个继承层次中只有一个这样的成员,无论从基类中派生出多少个派生类,每个static成员只有一个实例。
static成员遵循常规访问控制,可以通过基类访问static成员,也可以通过派生类访问static成员,可以使用域操作符也可以使用点或箭头操作符访问。