C++ - 无法从基类继承 |给出空值

Posted

技术标签:

【中文标题】C++ - 无法从基类继承 |给出空值【英文标题】:C++ - Unable to inherit from base class | Gives empty values 【发布时间】:2020-05-18 11:55:29 【问题描述】:

我想我在下面的代码中做错了。我想继承Employee类中Person类的方法。

#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

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

【问题讨论】:

您正在使用 new 在堆上创建您的 Employee e,但永远不要删除它。在这种情况下这无关紧要,因为您的程序会立即终止,但从技术上讲,这是内存泄漏。一旦不再需要它,您需要调用删除您的 Employee*,使用智能指针或使用 Employee e("John", 24, 14298); 在堆栈上创建 e。这与您的问题无关,但如果您不知道,我认为值得一提。 【参考方案1】:

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

这段代码:

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

将局部变量 name 分配给自身,并与 age 相同,因为参数会影响类成员名称。同名的成员对象永远不会被初始化。

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

    使用member initializer list 初始化您的成员:

    Person(string name, int age) : namename, ageage
     
    
    

    使用不同的名称

    Person(string providedName, int providedAge)
     
        name = providedName;
        age = providedAge;
    
    

    使用this 消除对象的歧义

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

【讨论】:

这成功了!感谢您提供多种方法,他们以更好的方式消除了我的疑问。【参考方案2】:

与继承无关,反正代码会出错。

这个

    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)
    

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

【讨论】:

以上是关于C++ - 无法从基类继承 |给出空值的主要内容,如果未能解决你的问题,请参考以下文章

C++派生类是不是可以从基类继承静态数据成员和静态成员函数?

C++ - 让派生类从基类“继承”重载赋值运算符的安全/标准方法

C++不能使用从基类继承的getter函数

派生类不从基类继承重载方法

错误:与 'operator=' 不匹配。试图从基类继承并从基类初始化?

类的继承与派生