基类与派生类对象的关系 派生类的构造函数

这篇具有很好参考价值的文章主要介绍了基类与派生类对象的关系 派生类的构造函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰 基类与派生类对象的关系

 🐰派生类的构造函数


🐰 基类与派生类对象的关系

前提引入:

公用派生类具有基类的全部功能(可以通过基类的公用成员函数访问基类的私有成员),所有基类能够实现的功能,公用派生类都能实现。而非公用派生类(私有或保护派生类)不能实现基类的全部功能。因此,基类对象与公用派生类对象之间有赋值兼容关系。

(1)公用派生类对象可以向基类对象赋值

由于公用派生类具有基类所有成员,所以把公用派生类的对象赋给基类对象

Person person("Marry","F",19);//定义基类Person对象person
//定义基类Person的公用派生类Student的对象student
Student student("Marry","F",19,"214210203","2021.9.1",680);
person=student;

注意:在赋值时时舍弃派生类新增成员,所谓的赋值只对数据成员赋值,对成员函数不存在赋值

基类与派生类对象的关系 派生类的构造函数

注意:基类对象是不能对公用派生类进行赋值,例如student=person是不存在的。因为基类成员中不包含派生类的新增成员,无法对派生类新增成员赋值,同一基类的不同派生类的对象之间也不能进行赋值。

(2)公用派生类对象可以代替基类对象向基类对象的引用进行赋值或初始化

Person person("Marry","F",19);
Student student("Marry","F",19,"214210203","2021.9.1",680);
//定义基类Person的对象引用personref,并用person对其初始化
Person &personref=person;
//也可以用对象student对引用personref进行初始化,将上面的语句Person &personref=person;修改为
Person &personref=student;
//或者
Person &personref=person;
personref=student;//用派生类对象student对person的引用personref赋值

基类与派生类对象的关系 派生类的构造函数

同样,公用派生类对象的地址可以代替基类对象地址向指向基类对象的指针进行赋值或初始化,即指向基类对象的指针也可以指向公用派生类对象。但是通过指向基类对象的指针只能访问公用派生类对象中基类成员,而不能访问公用派生类对象新增的成员。

3)如果函数参数是基类对象或基类对象的引用,相应的实参可以使用公用派生类对象。

例如:

void show(Person &ref)
{
    cout<<ref.show()<<endl;
}
则调用函数show时可以使用基类Person的公用派生类对象作为实参:
//定义基类Person的公用派生类Student的对象student
Student student("Marry","F",19,"214210203","2021.9.1",680);
show(student);

同样,如果函数的参数是指向基类的对象的指针,相应的实参可以为公用派生类的对象的地址。

void show(Person *p)
{
    Cout<<p->show()<<endl;
}
则在调用函数show时可以使用student的地址作为实参:
Show(&student);

 

 🐰派生类的构造函数

派生类的构造函数

构造函数的作用是创建对象时对对象的数据成员进行初始化。派生类数据成员包括从基类继承过来的数据成员和自己新增加的数据成员,但是派生类并不能直接初始化从基类继承过来的数据成员,他必须使用基类的构造函数来初始化它们,在派生类构造函数的初始化列表中写出对基类构造函数的调用。

派生类的构造函数:
#include<iostream>
using namespace std;
class Person
{
public:
    Person()//无参的默认构造函数
    {
        ;
    }
    Person(string Name,string Sex,int Age):name(Name),sex(Sex),age(Age)//有参的构造函数
    {
        cout<<"The constructor of base class Person is called. "<<endl;
    }
    void show()
    {
        cout<<"The person's name:"<<name<<endl;
        cout<<"             sex:"<<sex<<endl;
        cout<<"             age:"<<age<<endl;
    }
    ~Person()//默认的析构函数
    {
        ;
    }
protected:
    string name;
    string sex;
    int age=0;
};
class Student:public Person//声明基类Person的公用派生类Student
{
public:
    Student()//无参的默认构造函数
    {
        ;
    }
    Student(string Name,string Sex,int Age,string Id,string Date,floatScore):Person(Name,Sex,Age),id(Id),date(Date),score(Score)//有参的构造函数,在初始化列表中调用基类的构造函数
    {
        cout<<"The constructor of base class Student is called. "<<endl;
    }
    void stushow()
    {
        cout<<"             student's id:"<<id<<endl;
        cout<<"                     name:"<<name<<endl;
        cout<<"                      sex:"<<sex<<endl;
        cout<<"                      age:"<<age<<endl;
        cout<<"                     date:"<<date<<endl;
        cout<<"                    score:"<<score<<endl;
    }
    ~Student()
    {
        ;
    }
protected:
    string id;
    string date;
    float score=0.0;
};
int main()
{
    Student stu("Marry","man",19,"214210203","2021.09.01",523);
    stu.show();
    stu.stushow();
    return 0;
}
运行结果:
The constructor of base class Person is called.
The constructor of base class Student is called.
The person's name:Marry
             sex:man
             age:19
             student's id:214210203
                     name:Marry
                      sex:man
                      age:19
                     date:2021.09.01
                    score:523
Student(string Name,string Sex,int Age,string Id,string Date,floatScore):Person(Name,Sex,Age),id(Id),date(Date),score(Score)//有参的构造函数,在初始化列表中调用基类的构造函数
冒号前面是派生类Student构造函数的主干,它和以前的构造函数形式相同,但是它的总参数列表中包含着调用基类Person的构造函数所需的参数和对派生类新增的数据成员初始化所需的参数。通过冒号后面的初始化列表完成将参数传递给基类的构造函数和对派生类新增数据成员的初始化工作。
派生类构造函数的具体执行过程:
先调用基类的构造函数,对派生类对象从基类继承过来的数据成员(name,sex,age)进行初始化。接下来初始化派生类新增的数据成员(id,date,score)。最后执行派生类构造函数的函数体。
定义派生类的构造函数,以下几种情况需要注意:
(1)多级派生类的构造函数。 一个类不仅可以派生出一个类,派生类还可以继续派生,形成派生的层次结构。在派生层次结构中,每一层派生类的构造函数只负责调用其上一层(即它的直接基类)的构造函数。例如,在派生类Student再派生出派生类Graduate,则派生类Gradute的构造函数如下:
class Gradute:public Student
{
public:
    Gradute()
    {
        ;
    }
    Gradute(string Name,string Sex,int Age,string Id,string Date,float Score,stringDirect,string Teacher):Student(Name,Sex,Age,Id,Date,Score),direct(Direct),teacher(Teacher)
    {
        cout<<"The constructor of base class Gradute is called. "<<endl;
    }
    void gradShow()
    {
        cout<<"             student's id:"<<id<<endl;
        cout<<"                     name:"<<name<<endl;
        cout<<"                      sex:"<<sex<<endl;
        cout<<"                      age:"<<age<<endl;
        cout<<"                     date:"<<date<<endl;
        cout<<"                    score:"<<score<<endl;
        cout<<"                   direct:"<<direct<<endl;
        cout<<"                  teacher:"<<teacher<<endl;
    }
protected:
    string direct;
    string teacher;
};
(2)当不需要对派生类新增的成员进行任何初始化操作时 ,此派生类构造函数的作用只是为了将参数传递给基类构造函数。
(3)如果基类中没有定义构造函数,或者定义了没有构造参数的构造函数那么在定义派生类构造函数时,在其初始化列表中可以不写对基类构造函数的调用。 在调用派生类构造函数时,系统会自动调用基类的默认构造函数。
如果基类中定义了无参构造函数,又定义了有参的构造函数(构造函数的重载),则在定义派生类构造函数时,在其初始化列表中既可以包含对基类构造函数的调用,也可以不用,根据创建派生类的需求来采用哪种方式。

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸  文章来源地址https://www.toymoban.com/news/detail-409768.html

到了这里,关于基类与派生类对象的关系 派生类的构造函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于C/C++将派生类赋值给基类的详细讲解

    目录 将派生类对象赋值给基类对象 将派生类指针赋值给基类指针

    2024年02月08日
    浏览(54)
  • 类与对象之构造函数

    本文是md导入的可能格式有点乱,希望各位理解一下 默认成员函数:用户没有显式实现, 编译器会生成的成员函数称为默认成员函数 任何类在什么都不写时,编译器会自动生成以下6个默认成员函数 概念 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由

    2024年02月06日
    浏览(36)
  • 构造函数,原型,实例,类的关系整理

    视频来源js原型链、构造函数和类_哔哩哔哩_bilibili 如视频所说,构造函数的prototype指向原型,实例化的对象的__proto__指向原型,原型通过constructor指向构造函数,正如class里面的constructor方法就相当于Person构造函数一样,而我们在class中写在constructor之外的方法则是被默认放到

    2024年02月22日
    浏览(38)
  • 【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)

       🌈个人主页: 秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏:   目录 类的6个默认成员函数 构造函数 特性  析构函数 特性  析构的顺序 拷贝构造函数 特性 常引用      💬 hello! 各位铁子们大家好哇。              今日更新了类与对象的构造函数、

    2024年02月21日
    浏览(42)
  • C++初阶类与对象(二):详解构造函数和析构函数

    上次为类与对象开了一个头:C++初阶类与对象(一):学习类与对象、访问限定符、封装、this指针 今天就来更进一步 如果一个类中什么成员都没有,简称为空类。 空类中并不是什么都没有,任何类在什么都不写时,编译器会 自动生成上面6个默认成员函数 。 默认成员函数

    2024年01月19日
    浏览(45)
  • 【C++初阶】类与对象:6个默认成员函数-----构造函数和析构函数

        我们在写代码的时候经常会忘记初始化和销毁,C++的构造函数和析构函数就能避免这个问题。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 1.构造函数是一个特殊的成员函数; 2. 名字与类名相同 ,创建类类型对象时由 编译器自动调用

    2024年02月05日
    浏览(43)
  • 【是C++,不是C艹】 类与对象 | 默认成员函数 | 构造函数 | 析构函数

    💞💞 欢迎来到 Claffic 的博客 💞💞  👉  专栏: 《是C++,不是C艹》👈 前言: 在完成类与对象的认识后,我们接着学习类与对象的第二部分:默认成员函数,它包括构造函数,析构函数,拷贝构造,赋值重载,普通对象取地址和const对象取地址重载,放心,这一期不会都

    2024年02月09日
    浏览(37)
  • 【C++】类和对象②(类的默认成员函数:构造函数 | 析构函数)

    🔥 个人主页: Forcible Bug Maker 🔥 专栏: C++ 目录 前言 类的6个默认成员函数 构造函数 概念 构造函数的特性及用法 析构函数 概念 析构函数的特性及用法 结语 本篇主要内容:类的6个默认成员函数中的 构造函数 和 析构函数 进入到类和对象内容的第二节,上篇博客中介绍了

    2024年04月16日
    浏览(52)
  • 【C++】类与对象——六个默认成员函数、构造函数的概念和特征,析构函数的概念和特征

      如果一个类中什么成员都没有,简称为空类。   空类中真的什么都没有吗?   并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。     构造函数是C++中的一

    2024年02月06日
    浏览(50)
  • 【C++初阶】类与对象:6大默认成员函数------拷贝构造和赋值运算符重载

      拷贝构造函数: 只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰) ,在用已存在的类类型对象创建新对象时由编译器自动调用。 1. 拷贝构造函数是 构造函数的一个重载形式 ; 2. 拷贝构造函数的 参数只有一个且必须是类类型对象的引用 ,使用传值方式编

    2024年02月03日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包