C++ - 无法从基类继承 |提供空值

C++ - Unable to inherit from base class | Gives empty values

本文关键字:空值 继承 基类 C++      更新时间:2023-10-16

我想我在下面的代码中做错了什么。我想继承类员工中类人的方法。

#include<bits/stdc++.h>
using namespace std;
class Person{
private:
string name;
int age;
public:
Person(string name, int age){ //Base parameterized constructor
name = name;
age = age;
}
void getName(){
cout<<"Name: "<<name<<endl;
}
void getAge(){
cout<<"Age: "<<age<<endl;
}
};
class Employee: public Person{ //Default inheritance type is private
private:
int employeeID;
public:
Employee(string name, int age, int id) : Person(name, age){  //Derived parameterized constructor
employeeID = id;
}
void getEmployeeDetails(){
getName();
getAge();
cout<<"Employee ID: "<<employeeID<<endl;
}
};
int main(){
Employee* e = new Employee("John", 24, 14298);
e->getEmployeeDetails();
return 0;
}

我得到以下输出:

名字:

年龄: 0

员工编号: 14298

请让我知道我在这里错过了什么。任何帮助将不胜感激!

问题不在于继承,而在于Person从不初始化其任何字段的事实。

此代码:

Person(string name, int age){ //Base parameterized constructor
name = name;
age = age;
}

将局部变量name赋给自身,并与age相同,因为参数隐藏类成员名。同名的成员对象永远不会初始化。

三种可能的解决方案(按我更喜欢的主观顺序列出(:

  1. 使用成员初始值设定项列表初始化成员:

    Person(string name, int age) : name{name}, age{age}
    { 
    }
    
  2. 使用不同的名称

    Person(string providedName, int providedAge)
    { 
    name = providedName;
    age = providedAge;
    }
    
  3. 使用this消除对象的歧义

    Person(string name, int age){ //Base parameterized constructor
    this->name = name;
    this->age = age;
    }
    

与继承无关,无论如何代码都是错误的。

Person(string name, int age){ //Base parameterized constructor
name = name;
age = age;
}

应该是这个

Person(string n, int a){
name = n;
age = a;
}

由于构造函数参数声明名称与成员变量相同,因此成员变量是隐藏的,您只是将参数分配给它们自己。

编写相同代码的更好方法是使用初始化器列表

Person(string name, int age) : name(name), age(age)
}

初始化器列表有几个优点,其中之一是没有歧义,您可以使参数名称与成员变量名称相同。另一个(更重要的(是,一般来说,初始化比赋值更有效。