【发布时间】:2013-10-31 15:32:21
【问题描述】:
在我的代码中,Manager 派生自 Employee,它们每个都有一个 operator<< 覆盖。
class Employee{
protected:
int salary;
int rank;
public:
int getSalary()const{return salary;}
int getRank()const{return rank;}
Employee(int s, int r):salary(s), rank(r){};
};
ostream& operator<< (ostream& out, Employee& e){
out << "Salary: " << e.getSalary() << " Rank: " << e.getRank() << endl;
return out;
}
class Manager: public Employee{
public:
Manager(int s, int r): Employee(s, r){};
};
ostream& operator<< (ostream& out, Manager& m){
out << "Manager: ";
cout << (Employee)m << endl; //can not compile, how to call function of Employee?
return out;
}
我希望cout << (Employee)m << endl; 会调用ostream& operator<< (ostream& out, Employee& e),但它失败了。
【问题讨论】:
-
编译错误是什么?
-
您正在切片(至少代码正在尝试;查找)。你需要写
static_cast<Employee&>(m)而不是(Employee)m。 -
@ScarletAmaranth 它应该无法编译,因为临时的
Employee无法绑定到Employee&。如果您使用的是 MSVC,那么它有一个非常愚蠢的扩展,允许这种危险行为。 -
(Employee)m将生成 m 的 Employee 部分的副本,这是一个临时的。我不认为它可以匹配你的重载的Employee & e参数。 -
@Simple:幸运的是 g++ 会因此而严厉惩罚你。 :)
标签: c++ operator-overloading operator-keyword derived-class