C++基类和派生类的构造函数(二)

本文介绍了C++中派生类构造函数如何调用基类构造函数的规则。当创建派生类对象时,必须调用基类构造函数。如果派生类构造函数未明确指定基类构造函数,将默认调用基类的无参构造函数。如果基类没有无参构造函数,编译会失败。通过示例代码展示了如何在派生类构造函数中显式调用基类构造函数,并分析了不同调用方式对对象初始化的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基类构造函数调用规则
事实上,通过派生类创建对象时必须要调用基类的构造函数,这是语法规定。换句话说,定义派生类构造函数时最好指明基类构造函数;如果不指明,就调用基类的默认构造函数(不带参数的构造函数);如果没有默认构造函数,那么编译失败。请看下面的例子:

#include <iostream>
using namespace std;

//基类People
class People{

public :
    People() ;//基类默认构造函数
    People(char *name,int age);

protected:
    char *m_name;
    int m_age;
};
People::People():m_name("XXX"),m_age(0){}
People::People(char *name,int age):m_name(name),m_age(age){}

//派生类Student
class Student:public People{
public:
    Student();
    Student(char*,int ,float);

public:
    void display();

private:
    float m_score;
};

Student::Student():m_score(0){} //派生类默认构造函数
Student::Student(char *name,int age,float score):People(name,age),m_score(score){}

void Student::display(){
    cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<"。"<<endl;
}
int main(){
    Student stu1;
    stu1.display();
    Student stu2("小明", 16, 90.5);
    stu2.display();
    return 0;
}

运行结果:
xxx的年龄是0,成绩是0。
小明的年龄是16,成绩是90.5。

创建对象 stu1 时,执行派生类的构造函数Student::Student(),它并没有指明要调用基类的哪一个构造函数,从运行结果可以很明显地看出来,系统默认调用了不带参数的构造函数,也就是People::People()。

创建对象 stu2 时,执行派生类的构造函数Student::Student(char *name, int age, float score),它指明了基类的构造函数。

在第 27 行代码中,如果将People(name, age)去掉,也会调用默认构造函数,第 37 行的输出结果将变为:
xxx的年龄是0,成绩是90.5。

如果将基类 People 中不带参数的构造函数删除,那么会发生编译错误,因为创建对象 stu1 时需要调用 People 类的默认构造函数, 而 People 类中已经显式定义了构造函数,编译器不会再生成默认的构造函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值