子类的构造函数和析构函数的知识

今天研究了下子类的构造函数和析构函数,以及2个子类时的情况。见如下代码:

#include <stdio.h>

struct People
{
    People(const char* name, int age):name(name), age(age)// 知识点1:这里不能
    //加virtual,因为在父类调用构造函数期间,子类对象还没初始化完毕,还不能调用子类的函数。
    {
        printf("People is created!\n");
    }

    virtual ~People() // 知识点2:这里必须加加virtual,否则delete时Student类的
    // 析构函数不会被调用,会造成内存泄露。
    {
        printf("People is destoryed!\n");
    }

    virtual float getScore() const {}; // 知识点3:将其设为(纯)虚函数,在子类中实现。注意括号不能少
    virtual const char* getSubject() const {};
public:
    char const *name;
    int age;
};

struct Student : People
{
    Student(const char* name, int age, float score) : People(name, age), score(score)
    //知识点4:加const是为了消除将string转为char*时的告警,本文将中共加了3处
    //知识点5:name和age必须在基类People中初始化
    {
        printf("Student is created!\n");
    }

    ~Student()
    {
        printf("Student is destoryed!\n");
    }

    float getScore() const
    {
        return score;
    }

private:
    float score;
};

struct Teacher : People
{
    Teacher(const char* name, int age, const char* subject) : People(name, age), subject(subject)
    {
        printf("Teacher is created!\n");
    }

    ~Teacher()
    {
        printf("Teacher is destoryed!\n");
    }

    const char* getSubject() const
    {
        return subject;
    }

private:
    const char* subject;
};

int main(int argc, char* argv[])
{
    People *people1 = new Student("Bluce", 18, 91.5);//知识点6:创建时先调父类的构造函数,再调子类的构造函数
    //浩哥提醒:这里的people1是由stu1改的,因为如果传给别人的话,别人就知道了这个人是学生,造成了隐私泄露

    printf("people1's name is %s, age is %d, score is %f\n", people1->name, people1->age, people1->getScore());
    // 知识点3:注意这里的score只能通过getScore()函数来调用,因为指针people1是People类的,它没有score这个成员变量。
    // 但是91.5已经存进了子类的成员变量score中,相当于:这块内存已经创建和初始化好了,但是people1指针取不出来。

    People * people2 = new Teacher("Alice", 30, "English");

    printf("people2's name is %s, age is %d, subject is %s\n", people2->name, people2->age, people2->getSubject());

    delete people1; //知识点6:销毁时先调子类的析构函数,再调父类的析构函数
    delete people2;

    return 0;
}

结果是:

[excise]$ g++ 子类的构造函数和析构函数.cpp 
[excise]$ ./a.out 
People is created!
Student is created!
people1's name is Bluce, age is 18, score is 91.500000
People is created!
Teacher is created!
people2's name is Alice, age is 30, subject is English
Student is destoryed!
People is destoryed!
Teacher is destoryed!
People is destoryed!

可以看到,Student和Teacher在释放时,分别调用了People的析构函数。可以理解为:创建Student和Teacher时,本身就创建了2个People类的对象。这应该不算内存重复释放。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码到程攻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值