🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
🐰继承和派生的概念
面向对象的设计有四个重要的特征:抽象,封装,继承和多态性
所谓的“继承”就是在一个或多个已存在的类的基础上建立一个新的类。已存在的类称为“基类”“父类”或“一般类”。新建立的类称为“派生类”“子类”或“特殊类”
“基类”和“派生类”是相对而言的。一个基类可以派生出多个派生类,每一个派生类又可以作为基类派生出新的派生类。
🐰派生类的声明
单继承派生类的声明:
1. Class 派生名:继承方式 基类名 2. { 3. 派生类新加的成员 4. };
其中,继承方式可以是public,protected,private,分别对应公有继承,受保护继承,私有继承。此项可选的,如果不写此项,则默认为private。
🐰派生类的构成
派生类中的成员保括从基类继承过来的成员和自己新增加的成员两大部分,从基类继承过来的成员体现了派生类从基类继承而获得的共性,而新增加的成员体现了派生类的个性。
🌸1.从基类接受成员
派生类要接收基类全部的成员(但不包括基类的构造函数和析构函数)也就是说没机会选择的,不能选择接受一部分,而舍弃一部分。
🌸2.调整从基类接受的成员
虽然派生类对基类成员的继承是没有选择的全部继承。但我们对成员做出调整。(1)可以改变基类成员在派生类的访问属性,这是通过指定继承方式来实现的,如果在声明派生类时指定继承方式是私有的,则基类中的公有成员和受保护成员在派生类中的访问属性就是私有的,在派生类外不能访问。(2)可以在派生类中声明一个与基类成员同名的成员,则派生类的新成员会屏蔽与其同名的基类成员。
🌸3.增加新成员
这体现了对基类功能的扩展,在声明派生类时,还应该定义派生类的构造函数和析构函数,因为构造函数和析构函数是不能从基类继承的。
🐰派生类中基类成员的访问属性
派生类中基类成员的访问属性不仅与在声明基类时所声明的访问属性有关,而且与在声明派生类时所指定的对基类继承方式,以及类内using声明语句的使用情况有关
🌸公用继承:
基类的公用成员和受保护成员在派生类中保持原有的访问属性,其私有成员仍为基类私有(派生类不可访问)
🌸私有继承:
基类的公用成员和受保护成员在派生类中成了私有成员,其私有成员仍为基类私有(派生类不可访问)
🌸受保护的继承:
基类的公用成员和受保护成员在派生类中成了受保护成员,其私有成员仍为基类私有(派生类不可访问)
受保护成员的意思:不能被外界访问,但可以被派生类的成员访问
公用继承:
采用公用继承的方式时,基类的公用成员和受保护成员在派生类中保持原有的访问属性,而基类的私有成员在派生类中并没有成为派生类的私有成员,它还是基类的私有成员,只有基类的成员函数可以访问它,而不能被派生类的成员函数访问,因此就成为派生类中的不可访问的成员
私有继承:
私有基类的公用成员和受保护成员在派生类中的访问属性相当于派生类的私有成员,即派生类的成员函数能访问它们,而在派生类外不能访问它们。私有基类的私有成员在派生类中成为不可访问的成员,只有基类的成员函数可以访问它们。
保护成员和保护继承:
在声明一个派生类时对基类的继承方式指定为protected的,成为保护继承,用保护继承方式建立的派生类称为保护派生类,其基类称为受保护的基类,也称保护基类。
保护继承的特点:保护基类的公用成员和保护成员在派生类中都成了保护成员,而基类的私有成员在派生类中并没有成为派生类的私有成员,它还是基类的私有成员。也就是把基类原有的公用成员也保护起来,不让类外访问。
🐰总结
1.派生类中,成员有四种不同的访问属性
(1)公用的:派生类内外都可以访问。
(2)受保护的:派生类内可以访问,派生类外不能访问,其下一层的派生类可以访问(公用继承)
(3)私有的:派生类内可以访问,派生类外不能访问。
(4)不可访问的:派生类内外都不可以访问。
注意:
(1)这里列出的成员的访问属性是指在派生类中所获得的访问属性
(2)所谓的派生类外部,是指在建立派生类对象的模块中,在派生类范围之外
(3)如果本派生类继续派生,则在不同的继承方式下,成员所获得的访问属性是不同的。
2.类的成员在不同作用域有不同的访问属性。
在学习过派生类之后,再讨论一个类的某成员的访问属性,一个要指明是在哪一个作用域中。如基类Circle的成员函数seRadius,它在基类中的访问属性是公用的,在私有派生类Cylinder中的访问属性私有的。
比较私有继承和保护继承,可以发现,直接派生类中,以上两种继承方式的作用实际上是相同的:在类外不能访问基类中的任何成员,而在派生类中可以通过成员函数访问基类中的公用成员和保护成员。但如果继续派生,在新派生类中,两种继承方式的作用就不同了。例如,如果以公用继承方式派生出一个新派生类,原有私有基类中的成员在新派生类中都成为不可访问的成员,无论在新派生类内或外都不可能访问,而原来保护基类中的公用成员和保护成员在新派生类中为保护成员,可以被新派生类的成员函数访问。
有时我们需要改变派生类继承得基类某个成员的可访问性,通过使用using声明。
1. #include<iostream> 2. using namespace std; 3. class Base 4. { 5. public: 6. size_t size() const 7. { 8. return n; 9. } 10. protected: 11. size_t n=0; 12. }; 13. class Derived:private Base 14. { 15. public: 16. using Base::size; 17. protected: 18. using Base::n; 19. }; 20. int main() 21. { 22. Derived s1; 23. cout<<s1.size()<<endl; 24. return 0; 25. } 26. 结果为:0
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸