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++ - 让派生类从基类“继承”重载赋值运算符的安全/标准方法