面对对象的语言具有四个特点:抽象,封装,继承和多态性。在上面的内容中我们已经分析了类和对象的概念,了解面对对象程序设计的两个重要特征--数据抽象与封装,已经能够设计出基于对象的程序,这个是面对对象设计的基础和需要掌握的思想。
如果要较好的面对对象进行程序的开发和设计,还必须掌握面对对象的另外两个重要的特征----继承性和多态性。
继承性是面对对象程序设计的重要特征,可以说,如果没有掌握继承性的概念,就相当没有掌握面对对象编程的思想。
在面对对象中,类与类存在三种关系,简单说明
万物都有继承的关系,继承是一种重要的关系,比如对于植物而言
每种植物都属于低等植物和高等植物中一种,所以继承高等植物或者低等植物所具有的特性,然后也拥有自己独特的特点形成一类。
其实类的一些名词和阐述可以依靠下边的一副图来说明
class 派生类名:基类名表 { 数据成员和成员函数声明 }; 基类名表 构成 访问控制 基类名1,访问控制,基类名2,...访问控制 基类名n 访问控制表示类对基类的继承方式,一共用三个关键词 public 公有继承 private 私有继承 protected 保护继承
注意:C++中的继承方式(public、private、protected)会影响子类的对外访问属性。
派生类继承了基类的全部成员函数和成员方法(除了构造函数和析构函数除外),但是这些成员的访问属性,在派生的过程中是可以进行调整,那如何进行调整,可以通过对类对基类的继承方式来进行访问控制。
不同的继承方式会改变继承成员的访问属性
C++中的继承方式会影响子类的对外访问的属性
public继承:父类成员在子类中保持原有的访问级别
private继承:父类在子类中会变成private成员
protected继承:父类中public成员会变成protected
父类中protected成员仍然为protected
父类中private成员仍然为private
private成员在子类中依然存在,但是却无法访问到。无论哪一种方式继承基类,派生类都无法直接的使用基类的私有成员。
继承的访问控制图
C++中的继承方式(public、private、protected)会影响子类的对外访问属性
判断某一句话,能否被访问:
思考:如何恰当的使用public,protected和private为成员声明访问级别?
类型兼容原则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来代替。通过公共继承,派生类得到了基类中除构造函数和析构函数之外的所有成员。这样,公有派生类实际就具备基类所有功能,凡是基类能解决的问题,公有派生类都可以解决。类型兼容原则中所指的替代包括以下几种情况:
在替代之后,派生类对象就可以作为基类的对象进行使用,但是只能使用从基类继承的成员。类型兼容规则是多态性的重要基础之一。
但是对以上进行总结就是子类是特殊的父类(base *p = &child)
类在C++编译的内部都可以理解成结构体
子类是由父类成员叠加子类新成员得到的
//子类对象如何初始化父类成员 //继承中的构造和析构 //继承和组合混搭情况下,构造函数、析构函数调用顺序研究 #include <iostream> using namespace std; class Object { public: Object(const char* s) { cout << "Object()" << " " << s << endl; } ~Object() { cout << "~Object()" << endl; } }; class Parent : public Object { public: Parent(const char* s) : Object(s) { cout << "Parent()" << " " << s << endl; } ~Parent() { cout << "~Parent()" << endl; } }; class Child : public Parent { protected: Object o1; Object o2; public: Child() : o2("o2"), o1("o1"), Parent("Parameter from Child!") { cout << "Child()" << endl; } ~Child() { cout << "~Child()" << endl; } }; void run() { Child child; } int main(int argc, char* argv[]) { cout << "demo_extend_construct_destory.cpp" << endl; run(); system("pause"); return 0; }
得到的结果如下所示:
从上面的例子我们可以了解到:
原则: 先构造父类,在构造成员变量,最后构造自己
先析构自己,在析构成员变量,最后析构父类
感觉有点类型队列
使用一张图来表示继承对于同名变量的处理方式
如果继承和static关键字在一起会发生什么现象了
理论知识:
总结:
class 派生类:访问控制 基类名1,访问控制,基类名2...访问控制,基类名n
{
成员函数和成员变量;
};
如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性,比如以下的示意图所示:
继承的总结: