|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 moc 于 2018-9-9 16:48 编辑
1、概念
继承:我们依据已有的一个类来定义一个类,这使得创建和维护一个应用程序变得更容易,也可以达到了重用代码功能和提高执行时间的效果。
已有的类称为基类或父类,新建的类称为派生类或子类。
继承代表了 is a 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。
类访问级别的设置原则:
1.需要被外界访问的成员直接设置为public;
2.只能在当前类的内部访问,既不能在类的外部也不能在子类的内部访问的成员的设置为private;
3.只能在当前类的内部和子类的内部访问的访问的成员设置为protected;
继承方式对子类访问的影响:
1.public继承:父类成员在子类中保持原有的访问级别;
2.private继承: 父类所有成员在子类中均变为private;
3.protected继承:父类private成员在子类中仍为private,public和protected都变为protected。
注意:不管是哪种继承方式,子类都会继承父类的私有成员,但是子类无法访问从父类继承的私有成员。
总结:不同的继承方式会改变继承成员的访问属性。
继承中的父子关系:
1.子类拥有父类的所有成员变量和成员函数
2.子类是一种特殊的父类(赋值兼容性原则)
3.子类对象可以当父类对象使用
4.子类可以拥有父类没有的方法和属性
判断继承成员是否可访问三要素:
1 看访问父类的属性(函数)是在子类的内部还是外部
2 看子类如何从父类继承的(public, protected, private)
3 看在父类中的访问权限
2、继承中的重名成员与静态成员
子类中可以定义于父类同名的成员或方法,在子类中访问同名的成员或方法时,会屏蔽掉父类中的成员。
如果想在子类中使用父类的同名成员或方法,需要显示的使用类的限定符: 类名::成员
- class base
- {
- public:
- int a, b;
- };
- class derived:public base.
- {
- public:
- int b, c;
- };
- void f()
- {
- derived d;
- cout << d.b << d.base::b << endl;
- }
复制代码
静态成员:
父类定义的静态成员,将被所有的子类共享,即内存中只有一个,所有类和对象共享。
静态成员的访问特性和普通成员一致;
子类继承的静态成员同样有两种访问方式,子类名::静态成员 对象名.静态成员
3、继承中的构造和析构
1、父类的属性,应该有父类的构造函数去初始化;
2、子类新增加的属性,应该有子类的构造函数完成。
混搭中的构造与析构:
先构造的父类(从顶至下),在构造包含的类(按定义顺序),最后构造自己,析构方向与之相反,先构造后析构。
- #include<iostream>
- using std::cout;
- 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
- {
- public:
- Child(): o2("o2"), o1("o1"), Parent("Parameter from Child!")
- {
- cout<< "Child()" << endl;
- }
- ~Child()
- {
- cout<< "~Child()" << endl;
- }
- protected:
- Object o1;
- Object o2;
- };
- void run()
- {
- Child child;
- }
- int main()
- {
- run();
- system("pause");
- return 0;
- }
复制代码
4、多继承与虚基类
一个类可以从多个基类继承来,这种继承关系即多继承。
如果一个子类从多个父类继承,而这些父类又有一个共同的父类,则在对该共同的父类中声明的名字进行访问时,会产生二义性。
原因是:子类通过不同的路径对同一个父父类进行了多次继承。如果要避免这种多次继承,需要在公共的父类的子类继承该父类时前面加virtual,使之成为虚基类。
例:
- class B {public: int b;};
- class B1: virtual public B {private: int b1;};
- class B2: virtual public B {private: int b2;};
- class C: public B1, public B2 {private: float d; };
- C cc;
- cout << cc.b; // OK
复制代码
5、类之间的关系
1. has-A
包含关系,即在新定义的类中,有类成员是其他的已有的类。
2. uses-A
使用关系,弱关系;一个类部分的使用另外一个类,通过类中的成员关联(做成员函数的参数),定义友元等。
3. is-A
继承,父子关系,这种关系具有传递性,但不具有对称性。 |
|