C++类继承时的构造函数

在C++类的继承中, 子类不仅要继承父类的属性和方法,而且还要继承其构造函数和析构函数。本文将详细讲解在C++类继承时的构造函数。

构造函数和析构函数的继承规则

在C++中,子类的构造函数和析构函数会默认调用父类的构造函数和析构函数。具体规则如下:

  1. 子类的构造函数会默认调用父类的无参构造函数。

如果父类没有无参构造函数,则必须在子类的构造函数中显示的调用父类的有参构造函数。

  1. 子类的析构函数会默认调用父类的析构函数。

如果父类有虚析构函数,则子类的析构函数也要声明为虚函数。

举个栗子:

class Person{
public:
    Person(){
        cout << "Person's constructor is called!" << endl;
    }
    ~Person(){
        cout << "Person's destructor is called!" << endl;
    }
};
class Student:public Person{
public:
    Student(){
        cout << "Student's constructor is called!" << endl;
    }
    ~Student(){
        cout << "Student's destructor is called!" << endl;
    }
};

int main(){
    Student s;
    return 0;
}

在这个例子中,子类Student继承了Person类,主函数中创建了一个Student对象s。当构造函数调用完毕时,输出的结果如下:

Person's constructor is called!
Student's constructor is called!
Student's destructor is called!
Person's destructor is called!

可以看到,构造函数和析构函数都按照继承规则调用了。

类构造函数的重载

当子类调用父类的构造函数时,可以选择调用有参构造函数或者无参构造函数。

子类的构造函数可以重载父类的构造函数。当然,这时需要在子类的构造函数中显示调用父类的构造函数,以保证父类的成员变量正常赋值。

举个栗子:在上面的示例中,如果我们要给Person类添加一个name成员变量,使得在子类构造时可以赋值,那么可以这么写:

class Person{
public:
    string name;
    Person(){
        cout << "Person's default constructor is called!" << endl;
    }
    Person(string n){
        name = n;
        cout << "Person's constructor with parameter " << name << " is called!" << endl;
    }
    ~Person(){
        cout << "Person's destructor is called!" << endl;
    }
};
class Student:public Person{
public:
    Student(){
        cout << "Student's default constructor is called!" << endl;
    }
    Student(string n):Person(n){
        cout << "Student's constructor with parameter " << n << " is called!" << endl;
    }
    ~Student(){
        cout << "Student's destructor is called!" << endl;
    }
};

int main(){
    Student s("Jack");
    cout << s.name << endl;
    return 0;
}

在这个例子中,Person类添加了一个string类型的name成员变量。在Student类中,重载了Person类的构造函数,以接受name参数。在构造子类对象时,可以直接调用带参数的构造函数,同时给成员变量name赋值。

输出的结果如下:

Person's constructor with parameter Jack is called!
Student's constructor with parameter Jack is called!
Jack
Student's destructor is called!
Person's destructor is called!

可以看到,name成员变量成功赋值。同时,子类和父类的构造函数和析构函数都按照规则正常调用了。

结论

在C++类继承时的构造函数中,必须要遵守一些继承规则,包括子类继承了父类的构造函数,子类构造函数默认调用父类构造函数等。同时,为了让子类拥有一些自己的特性,可以在子类的构造函数中重载父类的构造函数,在构造子类对象时可以自己传递参数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++类继承时的构造函数 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 关于spring循环依赖问题及解决方案

    关于Spring循环依赖问题及解决方案 什么是循环依赖? 当两个或多个Bean相互依赖时,我们称之为循环依赖。在Spring中,循环依赖通常会导致一个Bean无法正确创建,如果不加以处理,这将成为Spring框架中的常见错误。 Spring如何解决循环依赖问题? Spring框架提供了三种解决方案,可以帮助我们解决循环依赖问题: 方案一:通过构造函数进行注入…

    other 2023年6月26日
    00
  • IE及IE6浏览器中判断JS文件加载成功失败的方法

    首先需要明确一点,IE6是一个古老的浏览器,已经不再被大多数新的网站所支持。因此,我们应该尽量避免在现代网站中使用IE6,而是针对现代浏览器进行开发和测试。但是,如果确实需要兼容IE6,那么以下是判断JS文件加载成功失败的方法: 使用onreadystatechange方法判断JS文件加载状态 <script type="text/javas…

    other 2023年6月25日
    00
  • React classnames原理及测试用例

    React classnames原理及测试用例 1. 原理说明 在React中,classnames是一个常用的工具库,用于动态生成类名。它可以帮助我们更方便地处理条件性的类名拼接,让代码更简洁易读。 工作原理:classnames库提供了一个classnames函数,可以接受多个参数,参数可以是字符串、对象和数组。它会根据参数的类型进行判断,根据不同的情况…

    other 2023年6月28日
    00
  • liststream()和foreach()

    以下是关于“liststream()和foreach()”的完整攻略,包括基本知识和两个示例。 基本知识 在Java中,list()和foreach()都是用于遍历集合的方法。其中,liststream()是Java 8中新增的方法,可以将List转换为Stream,而使用Stream API进行操作。而foreach()是Java中常用的遍历集合的方法,可…

    other 2023年5月7日
    00
  • 右键添加打开MS-DOS的批处理

    首先需要了解的是,MS-DOS已经在Windows Vista以及更高版本的Windows操作系统中被淘汰,因此,如果你是在Windows Vista之后的操作系统中使用,你需要使用“命令提示符”(CMD)代替MS-DOS。 以下是在Windows操作系统中通过右键添加打开MS-DOS的批处理的完整攻略: 打开记事本 将以下代码复制并粘贴到记事本中: Win…

    other 2023年6月27日
    00
  • Linux下Makefile的automake生成全攻略

    下面是关于Linux下Makefile的automake生成全攻略的详细讲解。 1. Makefile 和 automake 的概念说明 Makefile 是一种文件格式,使用 make 命令可以根据 Makefile 中的规则来编译、构建和安装程序。Makefile 是一种类似于脚本的东西,可以自动化完成工作,比手工编写命令方便得多。 automake 是…

    other 2023年6月26日
    00
  • Win10Mobile/PC创意者更新15063.414(413)累计更新补丁KB4022725更新修复内容汇总

    Win10Mobile/PC创意者更新15063.414(413)累计更新补丁KB4022725更新修复内容汇总攻略 本攻略将详细介绍Win10Mobile/PC创意者更新15063.414(413)累计更新补丁KB4022725的修复内容,并提供两个示例说明。 更新修复内容 以下是KB4022725更新修复的内容: 修复了网络连接问题:修复了在某些情况下,…

    other 2023年8月3日
    00
  • C语言的线性表之顺序表你了解吗

    C语言的线性表之顺序表攻略 什么是线性表 线性表是一种线性结构,具有前驱后继关系的表结构。线性表有两种存储结构:顺序存储和链式存储。 什么是顺序表 顺序表是一种用一段连续的存储单元依次存储线性表中各元素的存储结构,可以通过下标随机访问表中任意位置的元素。 顺序表的基本操作包括: 创建一个空表 向表中插入一个元素 删除表中一个元素 查找表中一个元素 遍历表中所…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部