(P30)继承:不能自动继承的成员函数 ,继承与构造函数 ,友元关系与继承 ,静态成员与继承

本文主要是介绍(P30)继承:不能自动继承的成员函数 ,继承与构造函数 ,友元关系与继承 ,静态成员与继承,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1.不能自动继承的成员函数
    • 2.继承与构造函数
    • 3.友元关系与继承
    • 4.静态成员与继承

1.不能自动继承的成员函数

  • 构造函数
    派生类要定义自己的构造函数,来对派生类成员进行初始化
  • 析构函数
    派生类要定义自己的析构函数,来对派生类成员进行清理工作
  • =运算符

2.继承与构造函数

  • 基类的构造函数不能被继承,派生类中需要声明自己的构造函数

  • 声明构造函数时,只需要对类中新增成员进行初始化,对继承来的基类成员的初始化 (需要调用基类的构造函数来完成)
    只要基类没有默认构造函数,基类的构造函数的调用只能在派生类的构造函数初始化列表中完成。

  • 派生类的构造函数需要给基类的构造函数传递参数

  • 哪几种情况只能在构造函数初始化列表中进行初始化?不能再构造函数体中进行初始化,在体内初始化应该叫做赋值。
    (1)const 成员
    const int n =100;
    (2)引用成员
    int n = 200;
    int &rn = n2;
    (3)基类没有默认构造函数的时候,基类的构造要再派生类构造初始化列表中调用
    (4)类的对象成员没有默认构造函数的时候,只能够再类的构造函数初始化列表中调用该对象的构造函数进行初始化

  • 派生类对象的构造次序:
    先调用基类的对象成员的构造函数,然后调用基类的构造函数,再然后是派生类的对象成员的构造函数,最后是派生类自身的构造函数

  • eg:

#include <iostream>
using namespace std;class Base
{
public:Base(){cout<<"Base..."<<endl;}~Base(){cout<<"~Base..."<<endl;}int b_;
};class Derived : public Base
{
public:Derived(){cout<<"Derived.."<<endl;}~Derived(){cout<<"~Derived.."<<endl;}int d_;};int main(void)
{Derived d;cout<<d.b_<<" "<<d.d_<<endl;return 0;
}
  • 测试:
    要构造派生类对象,先调用基类的构造函数,后调用派生类构造函数
    在这里插入图片描述

  • eg:

#include <iostream>
using namespace std;class Base
{
public:Base(int b) : b_(b){cout<<"Base..."<<endl;}~Base(){cout<<"~Base..."<<endl;}int b_;
};class Derived : public Base
{
public://没有明确指定调用基类的什么构造函数,默认调用基类的默认构造函数Derived(int b, int d) : d_(d), Base(b){cout<<"Derived.."<<endl;}~Derived(){cout<<"~Derived.."<<endl;}int d_;};int main(void)
{Derived d(100,200);cout<<d.b_<<" "<<d.d_<<endl;return 0;
}
  • 测试:
    在这里插入图片描述
  • eg:
#include <iostream>
using namespace std;class ObjectB()
{
public:ObjectB(){cout<<"ObjectB..."<<endl;}~ObjectB(){cout<<"~ObjectB..."<<endl;}
};class ObjectD()
{
public:ObjectD(){cout<<"ObjectD..."<<endl;}~ObjectD(){cout<<"~ObjectD..."<<endl;}
};class Base
{
public:Base(int b) : b_(b){cout<<"Base..."<<endl;}~Base(){cout<<"~Base..."<<endl;}int b_;ObjectB objB_;//若有多个对象成员,构造顺序按照声明的顺序进行构造
};class Derived : public Base
{
public://没有明确指定调用基类的什么构造函数,默认调用基类的默认构造函数Derived(int b, int d) : d_(d), Base(b){cout<<"Derived.."<<endl;}~Derived(){cout<<"~Derived.."<<endl;}int d_;ObjectD objd_;};int main(void)
{Derived d(100,200);cout<<d.b_<<" "<<d.d_<<endl;return 0;
}
  • 测试:
    派生类对象的构造次序:
    先调用基类的对象成员的构造函数,然后调用基类的构造函数,再然后是派生类的对象成员的构造函数,最后是派生类自身的构造函数

在这里插入图片描述

  • eg:P30\01.cpp
#include <iostream>
using namespace std;class ObjectB()
{
public:ObjectB(int objb) : objb_(objb){cout<<"ObjectB..."<<endl;}~ObjectB(){cout<<"~ObjectB..."<<endl;}int objd_;
};class ObjectD()
{
public:ObjectD(int objd) : objd_(obj){cout<<"ObjectD..."<<endl;}~ObjectD(){cout<<"~ObjectD..."<<endl;}int objd_;
};class Base
{
public:Base(int b) : b_(b), objb_(111){cout<<"Base..."<<endl;}//Base的拷贝构造函数//objb_(other.objb_)会调用ObjectB的拷贝构造函数,若没有,则调用默认的拷贝构造函数Base(const Base& other) : objb_(other.objb_), b_(other.b_){}~Base(){cout<<"~Base..."<<endl;}int b_;ObjectB objb_;//若有多个对象成员,构造顺序按照声明的顺序进行构造
};class Derived : public Base
{
public://没有明确指定调用基类的什么构造函数,默认调用基类的默认构造函数Derived(int b, int d) : d_(d), Base(b), objd_(222){cout<<"Derived.."<<endl;}//派生类的拷贝构造函数//Base(other)会调用基类的拷贝构造函数//在构造函数中要完成3件事情:d_(d), Base(b), objd_(222),同样在拷贝构造函数也要完成这三件事情//拷贝构造函数也是一种构造函数,它的写法基本上与构造函数的写法是一样的Derived(const Derived& other) : d_(other.d_), objd_(other.objd), Base(other){}~Derived(){cout<<"~Derived.."<<endl;}int d_;ObjectD objd_;};int main(void)
{Derived d(100,200);cout<<d.b_<<" "<<d.d_<<endl;Base b1(100);Base b2(b1);//会调用拷贝构造函数cout<<b2.b_<<endl;Derived d2(d);return 0;
}
  • 测试:
    在这里插入图片描述

3.友元关系与继承

  • 友元关系不能被继承
    A可以访问B的所有成员(公有、私有、保护成员)
    A是B的友元类,C是A的派生类,那么C不是B的友元类
  • 友元关系是单向的
    A是B的友元类,不带表B是A的友元类
  • 友元关系不能被传递
    A是B的友元类,B是C的友元类,那么A不是C的友元类

4.静态成员与继承

  • 静态成员无所谓继承
    因为静态成员被所有的类共享,其内存只有1份拷贝

  • eg:P30\02.cpp

#include <iostream>
using namespace std;class Base 
{
public:static int b_;
};
int Base::b_ = 100;
class Derived : public Base
{};int main()
{Base b;Base d;cout<<Base::b_<<endl;//推荐使用的方法,因为静态成员无所谓继承,因为它只有1份拷贝//不推荐下面的这种写法cout<<b.b_<<endl;cout<<Derived::b_<<endl;cout<<d.b_<<endl;return 0;
}
  • 测试:
    在这里插入图片描述

这篇关于(P30)继承:不能自动继承的成员函数 ,继承与构造函数 ,友元关系与继承 ,静态成员与继承的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1041383

相关文章

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

Spring使用@Retryable实现自动重试机制

《Spring使用@Retryable实现自动重试机制》在微服务架构中,服务之间的调用可能会因为一些暂时性的错误而失败,例如网络波动、数据库连接超时或第三方服务不可用等,在本文中,我们将介绍如何在Sp... 目录引言1. 什么是 @Retryable?2. 如何在 Spring 中使用 @Retryable

使用 Python 和 LabelMe 实现图片验证码的自动标注功能

《使用Python和LabelMe实现图片验证码的自动标注功能》文章介绍了如何使用Python和LabelMe自动标注图片验证码,主要步骤包括图像预处理、OCR识别和生成标注文件,通过结合Pa... 目录使用 python 和 LabelMe 实现图片验证码的自动标注环境准备必备工具安装依赖实现自动标注核心

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>