C++中的继承,如何从派生类初始化基类中的成员变量

时间:2021-01-18 20:15:56

标签: c++ inheritance

我今天几乎是第一次打开 C++,并尝试做一些继承。

我有一个名为 Person 的类和三个从 Person 派生的类,称为: 退休人员, 成人, 孩子。

控制台询问您的年龄,如果您在控制台中输入 30,我想创建一个新的成人对象,在这里我想传入参数:年龄、姓名和折扣。

在 java 中,我只会调用子类中的构造函数,因为它包含 super(a, b, c) 。但是当我在这里尝试这样做时,它不起作用,而且我似乎无法弄清楚原因。

下面是 Person 和 Adult 的两个 cpp 文件,显示了它们的构造函数,最后是 Main.cpp

当我尝试创建对象“LearnCPP.exe 中 0x759EA842 处的未处理异常:Microsoft C++ 异常:std::bad_alloc 在内存位置 0x00AFF514”时出现此错误。

Person.h

#pragma once
#include <String>
#include "BudgetAccount.h"
class Person
{

private:


public:
    Person(int32_t age, std::string name);

    int32_t getAge();

    void setAge(int32_t age);

    std::string getName();

    void setName(std::string name);

protected:
    int32_t age;
    std::string name;

};

Person.cpp

#include "Person.h"
#include <String>

Person::Person(int32_t age, std::string name)
{
    this->age = age;
    this->name = name;
}



int32_t Person::getAge() 
{

    return age;
}

void Person::setAge(int32_t age)
{
    this->age = age;
}

std::string Person::getName()
{
    return name;
}

void Person::setName(std::string name)
{
    this->name = name;
}

成人.h

#pragma once
#include "Person.h"
class Adult : public Person
{
private:
    double discount;

public:
    Adult(double discount);
};


成人.cpp

#include "Adult.h"

Adult::Adult(double discount) : Person(age, name)
{
    this->discount = discount;
}

Main.cpp

#include <iostream>
#include "Person.h"
#include "Adult.h"

int main()
{
    std::cout << "Hello Customer" << std::endl;
    std::cout << "Down below you see a list of cities" << std::endl;
    std::cout << "Please enter your name" << std::endl;
    //Cin 
    std::string name;
    std::cin >> name;

    std::cout << "Please enter your age" << std::endl;
    
    std::int32_t age;
    std::cin >> age;

    //Check if the entered age is child, adult or retiree
    
    Adult user(50.0);
    
    std::cout << "Please select which city you want to travel to" << std::endl;

    return 0;
}

2 个答案:

答案 0 :(得分:0)

我认为这是你的问题:

Adult::Adult(double discount) : Person(age, name)
{
    this->discount = discount;
}

您尚未将年龄或名称传递给此构造函数,因此它从父类使用它们——其构造函数尚未被调用。

答案 1 :(得分:0)

如前所述,您没有传递姓名和年龄的值。

  1. 对此的一种解决方案是,您可以更改构造函数以接收年龄和姓名的值。
  2. 另一个解决方案是您可以定义默认构造函数。您还可以在参数化构造函数中设置默认值。
<块引用>
Person::Person(int32_t age = 0, std::string name = ""){
    this->age = age;
    this->name = name; }