重写函数不打印基本 class 数据
Overridden function does not print base class data
我的代码中的 class 继承有问题。这是我正在做的事情:我有两个 classes,一个叫做 Employee,第二个叫做 Manager。 Employee是baseclass,它有打印名片的功能,包含公司名称和功能name(),打印员工的姓名。 ClassManager派生class继承(public:Employee)。当我尝试为经理打印同一张名片时,它不显示姓名,只显示公司名称。可能是什么问题呢?
下面是 Employee class:
的一小段
class Employee {
public:
// Constructor
Employee(const char* name, double salary) : _name(name), _salary(salary) {}
Employee() : _name(" "), _salary(0) {} // default constructor
// Accessors
const char* name() const { return _name.c_str() ; }
double salary() const { return _salary ; }
// Modifyers (if needed)
double set_salary( double salary) {
_salary = salary;
return _salary;
}
// Print functions
void businessCard(ostream& os = cout) const {
os << " +------------------+ " << endl
<< " | ACME Corporation | " << endl
<< " +------------------+ " << endl
<< " " << name() << endl ;
}
private:
string _name ;
double _salary ;
} ;
其次,经理class:
class Manager : public Employee {
public:
// Constructors
Manager(const char* name, double salary, set<Employee*>& subordinates) :
_name(name), _salary(salary), _subs(subordinates) {}
...
// Accessors
const char* name() const {
string name;
name += _name;
name += " (Manager)";
return name.c_str() ;
}
void businessCard(ostream& os = cout) const {
Employee::businessCard();
}
private:
string _name ;
double _salary ;
} ;
我认为问题出在name()函数中,因为如果我明确地写它,它就会出现在卡片上,尽管它不是继承的。
有人能帮忙吗?
当您调用 Employee::businessCard();
时,它将调用 Employee
中的 const char* name() const { return _name.c_str() ; }
class。但是在 Manager
对象的构建过程中,您还没有将名称传递给基础 class Employee
,因此它没有在 Employee
class 中设置并且你在打印时把它弄空了。
所以要让它工作,应该是这样的
Manager(const char* name, double salary, set<Employee*>& subordinates) : Employee(name,salary), _subs(subordinates)
并从管理器中删除 _name
和 _salary
成员变量,因为它违背了本例中继承的目的。
我的代码中的 class 继承有问题。这是我正在做的事情:我有两个 classes,一个叫做 Employee,第二个叫做 Manager。 Employee是baseclass,它有打印名片的功能,包含公司名称和功能name(),打印员工的姓名。 ClassManager派生class继承(public:Employee)。当我尝试为经理打印同一张名片时,它不显示姓名,只显示公司名称。可能是什么问题呢? 下面是 Employee class:
的一小段class Employee {
public:
// Constructor
Employee(const char* name, double salary) : _name(name), _salary(salary) {}
Employee() : _name(" "), _salary(0) {} // default constructor
// Accessors
const char* name() const { return _name.c_str() ; }
double salary() const { return _salary ; }
// Modifyers (if needed)
double set_salary( double salary) {
_salary = salary;
return _salary;
}
// Print functions
void businessCard(ostream& os = cout) const {
os << " +------------------+ " << endl
<< " | ACME Corporation | " << endl
<< " +------------------+ " << endl
<< " " << name() << endl ;
}
private:
string _name ;
double _salary ;
} ;
其次,经理class:
class Manager : public Employee {
public:
// Constructors
Manager(const char* name, double salary, set<Employee*>& subordinates) :
_name(name), _salary(salary), _subs(subordinates) {}
...
// Accessors
const char* name() const {
string name;
name += _name;
name += " (Manager)";
return name.c_str() ;
}
void businessCard(ostream& os = cout) const {
Employee::businessCard();
}
private:
string _name ;
double _salary ;
} ;
我认为问题出在name()函数中,因为如果我明确地写它,它就会出现在卡片上,尽管它不是继承的。 有人能帮忙吗?
当您调用 Employee::businessCard();
时,它将调用 Employee
中的 const char* name() const { return _name.c_str() ; }
class。但是在 Manager
对象的构建过程中,您还没有将名称传递给基础 class Employee
,因此它没有在 Employee
class 中设置并且你在打印时把它弄空了。
所以要让它工作,应该是这样的
Manager(const char* name, double salary, set<Employee*>& subordinates) : Employee(name,salary), _subs(subordinates)
并从管理器中删除 _name
和 _salary
成员变量,因为它违背了本例中继承的目的。