服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - c++ 子类构造函数初始化及父类构造初始化的使用

c++ 子类构造函数初始化及父类构造初始化的使用

2021-09-15 15:50sevencheng798 C/C++

这篇文章主要介绍了c++ 子类构造函数初始化及父类构造初始化的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

 我们知道,构造方法是用来初始化类对象的。如果在类中没有显式地声明构造函数,那么编译器会自动创建一个默认的构造函数;并且这个默认的构造函数仅仅在没有显式地声明构造函数的情况下才会被创建创建。

       构造函数与父类的其它成员(成员变量和成员方法)不同,它不能被子类继承。因此,在创建子类对象时,为了初始化从父类中继承来的成员变量,编译器需要调用其父类的构造函数。如果子类的构造函数没有显示地调用父类的构造函数,则默认调用父类的无参构造函数,至于什么事显式调用,在下面会详细说明!关于子类中构造函数的构造原则,总结如下,欢迎大家指导与批评。

         1.父类没有声明构造函数

         (1)子类也没有声明自己的构造函数,则父类和子类均由编译器生成默认的构造函数。

         (2)子类中声明了构造函数(无参或者带参),则子类的构造函数可以写成任何形式,不用顾忌父类的构造函数。在创建子类对象时,先调用父类默认的构造函数(编译器自动生成),再调用子类的构造函数。

         2.父类只声明了无参构造函数

         如果子类的构造函数没有显式地调用父类的构造,则将会调用父类的无参构造函数。也就是说,父类的无参构造函数将会被隐式地调用。

         3.父类只声明了带参构造函数

         在这种情况下,要特别注意。因为父类只有带参的构造函数,所以如果子类中的构造函数没有显示地调用父类的带参构造函数,则会报错,所以必需显示地调用。

关于构造函数的显示调用,参见下例。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class animal
{
protected//成员变量,声明为protected或者public,这里选择protected
    int height; //若声明为private,则不能被子类继承访问,会报错
    int weight;
public:
    animal(int height,int weight) //带参的构造函数
    {
        this->height=height;
        this->weight=weight;
        cout<<"animal的带参构造函数被调用"<<endl;
    }
    virtual ~animal()
    {
        cout<<"animal的析构函数被调用"<<endl;
    }
};
//子类
class fish:public animal
{
public:
    fish():animal(height,weight) //显示调用父类的构造函数
    {
        cout<<"fish的构造函数被调用"<<endl;
    }
    virtual ~fish()
    {
        cout<<"fish的析构函数被调用"<<endl;
    }
};

在子类fish的构造函数中,加上一个冒号(:),然后加上父类的带参构造函数,这就是父类构造函数的显式调用。这样,在子类的构造函数被调用时,系统就会去调用父类的带参构造函数,从而实现初始化父类的成员变量。运行结果如下:

c++ 子类构造函数初始化及父类构造初始化的使用

注意:

如果父类只有带参的构造函数,且该带参的构造函数的参数有默认值,此时在子类中也可以不用显示的调用父类的构造函数。

?
1
2
3
4
5
6
7
// 父类的构造函数,改成带有默认值的参数, 这样在子类中就可以不用显示调用了
  animal(int height=19 ,int weight=20) //带参的构造函数
  {
    this->height=height;
    this->weight=weight;
    cout<<"animal的带参构造函数被调用"<<endl;
  }

4.父类同时声明了无参和带参构造函数

         在这种情况下,子类只需要实现父类的一个构造函数即可,不管是无参的还是带参的构造函数。如果子类的构造函数没有显示地调用父类的构造函数(无参或带参),则默认调用父类的无参构造函数。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//父类
class animal
{
protected//成员变量,声明为protected或者public,这里选择protected
    int height; //若声明为private,则不能被子类继承访问,会报错
    int weight;
public:
    animal()
    {
        height=0;
        weight=0;
        cout<<"animal的无参构造函数被调用"<<endl;
    }
    animal(int height,int weight) //带参的构造函数
    {
        this->height=height;
        this->weight=weight;
        cout<<"animal的带参构造函数被调用"<<endl;
    }
    virtual ~animal()
    {
        cout<<"animal的析构函数被调用"<<endl;
    }
};
//子类
class fish:public animal
{
public:
    fish()  //没有显示地调用父类的构造函数(无参或带参),则默认调用父类的无参构造函数
    {
        cout<<"fish的构造函数被调用"<<endl;
    }
    virtual ~fish()
    {
        cout<<"fish的析构函数被调用"<<endl;
    }
};

运行结果如下:

c++ 子类构造函数初始化及父类构造初始化的使用

总结以上几条,可以归纳出C++中子类继承父类时构造函数的写法的规律:当父类有显式地声明了构造函数时,子类最低限度的实现父类中的一个;当父类没有声明构造函数时,子类可以不声明构造函数或者任意地书写构造函数。

到此这篇关于c++ 子类构造函数初始化及父类构造初始化的使用的文章就介绍到这了,更多相关c++ 子类构造函数初始化及父类构造初始化内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/sevenjoin/article/details/82222895

延伸 · 阅读

精彩推荐
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29