小言_互联网的博客

<C++>继承的进阶之构造与析构的调用顺序和同名成员的处理

368人阅读  评论(0)

祝天下的每位父亲,节日快乐

 

写在前面

      书接上文,今天要来学习继承的进阶内容:继承中构造和析构顺序以及静态与非静态的同名成员处理。那么下篇文章就是继承的完结了,很快就会更新哒。

       ✨✨ 感兴趣的同学可以订阅一下我的这个《C++入门》专栏喔~✨✨

目录

构造和析构的调用顺序

结论 

同名成员处理

非静态成员

成员属性

成员方法

静态成员

成员属性

成员方法

✨总结


构造和析构的调用顺序

        当子类继承父类时,创建子类对象,父类对象也会被创建。

示例:


  
  1. class Father
  2. {
  3. public:
  4. Father()
  5. {
  6. cout << "父类的无参构造调用" << endl;
  7. }
  8. ~ Father()
  9. {
  10. cout << "父类的析构函数调用" << endl;
  11. }
  12. };
  13. class Son : public Father
  14. {
  15. public:
  16. Son()
  17. {
  18. cout << "子类的无参构造调用" << endl;
  19. }
  20. ~ Son()
  21. {
  22. cout << "子类的析构函数调用" << endl;
  23. }
  24. };

        接下来通过test01创建子类并调用:


  
  1. void test01()
  2. {
  3. Son s;
  4. }

运行结果:

结论 

         创建子类对象时,编译器会自动调用父类的无参构造来构造创建父类对象。

        构造顺序:先父类后子类

        析构顺序:先子类后父类

同名成员处理

        成员包括成员属性和成员方法,考虑一下成员的静态与非静态的情况来分析处理。

非静态成员

        直接写在类的内部的普通成员。

成员属性

示例:


  
  1. class Father
  2. {
  3. public:
  4. int _age;
  5. Father() {
  6. _age = 48;
  7. }
  8. };
  9. class Son : public Father
  10. {
  11. public:
  12. int _age;
  13. Son() {
  14. _age = 21;
  15. }
  16. };
  17. void test()
  18. {
  19. Son S;
  20. cout << "子类的年龄:" << S._age << endl;
  21. cout << "父类的年龄:" << S.Father::_age << endl;
  22. }

运行结果:

        这里父类和子类都有年龄属性_age。我们知道子类的公共继承时可以访问父类中所有非私有权限的属性或者方法的,但是写在我在子类也做一个同名的属性,那么输出该属性的时候,到底是父类还是子类的属性呢?通过运行结果可以看到调用的是子类的属性。此外,要想访问父类的属性,需要加上作用域Father::,这样就能通过子类访问到父类的年龄属性了,

小结:

        子类访问同名属性的时候,优先访问子类的属性。

        访问父类属性的时候要加作用域运算符,即“类名+::

成员方法

示例:


  
  1. class Father
  2. {
  3. public:
  4. void showInfo(){
  5. cout << "这是父类中的showInfo()" << endl;
  6. }
  7. };
  8. class Son : public Father
  9. {
  10. void showInfo() {
  11. cout << "这是子类中的showInfo()" << endl;
  12. }
  13. };
  14. void test()
  15. {
  16. Son S;
  17. S. showInfo();
  18. S.Father:: showInfo();
  19. }

运行结果:

        这里在父类和子类中都定义了无返回值类型的showInfo方法,从运行结果中可以看到直接调用此方法,显示的是子类中showInfo的输出结果;那么同样的,想访问父类的该方法也是加上作用域。

小结:

        方法的同名处理与属性的同名处理方法一致。

静态成员

        属性或者方法前面加上static关键字的成员。对应静态成员,我们可以通过对象或者类名两种方式访问。

成员属性

示例:


  
  1. class Father
  2. {
  3. public:
  4. static int _age;
  5. };
  6. int Father::_age = 40;
  7. class Son : public Father
  8. {
  9. public:
  10. static int _age;
  11. };
  12. int Son::_age = 20;

        静态属性是在类内声明,类外定义。

通过对象调用:


  
  1. void test()
  2. {
  3. Son S;
  4. cout << "子类的年龄:" << S._age << endl;
  5. cout << "父类的年龄:" << S.Father::_age << endl;
  6. }

 运行结果:

通过类名调用:


  
  1. void test()
  2. {
  3. Son S;
  4. cout << "子类的年龄:" << Son::_age << endl;
  5. cout << "父类的年龄:" << Son::Father::_age << endl;
  6. }

         这里的运行结果和通过对象调用一致,但是父类的属性是通过子类来访问的,要注意到Son::Father::_age这行代码,第一个作用域符号意思是通过Son类访问,第二个作用域符号意思是Father作用域下的_age属性,只要理解这两个作用域符号的意思就能理解这行代码了。

成员方法

 示例:


  
  1. class Father
  2. {
  3. public:
  4. static void showInfo(){
  5. cout << "这是父类中的showInfo()" << endl;
  6. }
  7. };
  8. class Son : public Father
  9. {
  10. public:
  11. static void showInfo() {
  12. cout << "这是子类中的showInfo()" << endl;
  13. }
  14. };
  15. void test()
  16. {
  17. Son S;
  18. S. showInfo();
  19. S.Father:: showInfo();
  20. }

        静态成员方法与普通成员方法处理方法一致,而通过对象和通过类名访问和静态属性的处理方法一致,所以就不做多解释了。

✨总结 

        到这里关于继承的构造析构顺序以及静态与非静态成员的处理学习就结束了,最后一个静态成员方法的处理和访问,大家可以手动练习加以巩固,下篇我们不见不散!


转载:https://blog.csdn.net/m0_58618795/article/details/125354153
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场