首页 > 编程语言 >[c++_1]C++ 子类初始化父类成员

[c++_1]C++ 子类初始化父类成员

时间:2023-10-13 10:34:25浏览次数:41  
标签:调用 weight 子类 c++ height C++ 父类 构造函数

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

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

子类中构造函数的构造原则分如下4种:

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

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

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

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

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

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

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

#include <iostream>
using namespace std;

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;
    }   
};
int main()
{
    fish();
    return 0;
}

**若没有显示调用父类的构造函数,则会报错**

fish():animal(height,weight) //显示调用父类的构造函数
在子类fish的构造函数中,加上一个冒号(

标签:调用,weight,子类,c++,height,C++,父类,构造函数
From: https://www.cnblogs.com/yangjj08/p/17761486.html

相关文章

  • C++ 函数 const
    分为两种情况:在函数前加constconstintget_value(){}表示函数返回值为const。使用指针时有用。在函数后加constLinkList_length()const{}表示函数不修改class的成员。......
  • C++程序在debug结果正确但release结果错误或两个模式下结果不同
    今天在运行release工程时发现运行结果出现了-1.#IND00,1.#INF00。但是在debug下可以计算出数字。于是在网上查找资料。尝试修改配置属性优化方法为已禁用。未果尝试修改调试信息格式。未果尝试修改代码生成运行库。未果原因:最后通过输出变量仔细对比发现是某个函......
  • C++声明、定义、初始化
    声明声明可声明多次,而编译器不会为其分配存储空间。目的是为了使编译器知道该标识符所代表的含义及原型所在,文件与文件之间使用关键字extern修饰变量或函数称为声明(引用)可使同工程目录下的变量或函数实现交互说明符+表达式列表定义一般的情况下,把建立空间的声明......
  • C++内置函数用法
    1-substr函数(字符截取函数)格式1:substr(stringstring,inta,intb)string是需要截取的字符串;a是截取字符串的开始位置;(注:当a=0或1时,都是从第一位开始截取)b是要截取字符串的长度;格式2:substr(stringstring,inta)string是需要截取的字符串;a可以理解为第a个字符开始截取后面所有......
  • 关于如何解决visualc++6.0打开文件闪退的一种方式(附带解决输入法无法显示)
    这里我把VisualC++6.0安装程序和filetool分享在我的网盘里面了网盘下载QAQ链接:https://pan.baidu.com/s/1azSMX_cOKgb64WT7-gTdbQ?pwd=ayxs提取码:ayxs 下载后解压文件,运行filetool.exe 进入Visualc++6.0,我们要运行并打开这个filetool里的工作空间  然后单击工......
  • c++中的继承(上)
    继承的定义继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设......
  • C++ 11 auto关键字
    https://www.cnblogs.com/DswCnblog/p/5629048.html熟悉脚本语言的人都知道,很多脚本语言都引入了“类型自动推断”技术:比如Python,可以直接声明变量,在运行时进行类型检查。随着C++11标准的发布,C++语言也引入了类型自动推断的功能,这就是我们今天要介绍的auto关键字。C++是一种强......
  • Code-C++-chrono to tm (format time)
    Code-C++-chronototm(formattime)std::chrono::system_clock::time_pointnow=std::chrono::system_clock::now(); std::time_tnow_time_t=std::chrono::system_clock::to_time_t(now); std::tm*now_tm=std::localtime(&now_time_t); charbuffer[128......
  • Code-C++-Snowflake
    Code-C++-Snowflake#include<iostream>#include<chrono>#include<stdexcept>classSnowflake{private://雪花算法的各个参数staticconstexprint64_tworkerIdBits=5;staticconstexprint64_tdatacenterIdBits=5;staticcons......
  • C++ 11 Lambda表达式
    C++11Lambda表达式 C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数。对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如C#,Python等......