在c中重写operator <<
作者:互联网
我正在为我在C的学校做一个项目
我有2节课:Employe和Teacher.
源自Employe的老师,其职能已被覆盖.
我们覆盖运算符<<打印一些雇员或教师的信息.
每个类都有一个const int属性LevelAcces_.
对于Employe,是5,对于Teacher,是20.
当我在main.cpp中创建教师时,我调用了operator<<教师打印他的信息.
所以这个函数叫做:
ostream& operator<<(ostream& os, const Teacher& pTeacher){
os << (pTeacher);
return os;
}
但是,该函数使用“ os<<(pTeacher);”行来调用自身.并执行导致堆栈溢出的循环. 我希望行“ os<<(pTeacher)”调用运算符<<我班的Employe,而不是我班的老师. 覆盖运算符<<在Employe中:
ostream& operator<<(ostream& os, const Employe& pEmploye){
os << "Name: " << pEmploye.name_ << endl;
os << "Class: " << pEmploye.getClass() << endl;
os << "LevelAcces: " << pEmploye.getLevelAccess() << endl;
return os;
}
我试图将我的老师放到Employe中,但是当它显示消息时,LevelAcces是5(我想是20,因为我的Employe是一位老师).
我还尝试使用Employe :: operator<<但是运算符<<不是Employe的成员,所以它不起作用... 所以,这是我的问题: 我该怎么做才能使用我的运算符<<我的运算符中的Employe的<<并打印正确的信息(LevelAccess = 20,而不是5)? 我也想到了“虚拟”,但我们的教授告诉我们,不需要使用这个词. 提前致谢 :) 这是更完整的代码: main.cpp中:
Teacher Garry("Garry");
cout << Garry << endl;
Employe.cpp:
#include "Employe.h"
using namespace std;
Employe::Employe(){
name_ = "";
}
Employe::Employe(string pName){
name_ = pName;
}
string Employe::getName() const{
return name_;
}
unsigned int Employe::getLevelAccess() const{
return levelAccess_;
}
string Employe::getClass() const{
return typeid(*this).name();
}
ostream& operator<<(ostream& os, const Employe& pEmploye){
os << "Name: " << pEmploye.name_ << endl;
os << "Class: " << pEmploye.getClass() << endl;
os << "LevelAcces: " << pEmploye.getLevelAccess() << endl;
return os;
}
在Employe.h中:
private:
static const unsigned int LevelAccess_ = 5;
Teacher.cpp:
#include "teacher.h"
using namespace std;
Teacher::Teacher(string pName){
nom_ = pName;
}
unsigned int Teacher::getLevelAccess() const{
return(Employe::getLevelAccess() + accessTeacher_);
}
string Teacher::getClass() const{
return typeid(*this).name();
}
ostream& operator<<(ostream& os, const Teacher& pTeacher){
os << (pTeacher);
return os;
}
这是Teacher.h:
static const unsigned int accesTeacher_ = 15;
解决方法:
我要做的是:仅定义一个
ostream& operator<<(ostream& os, const Employe& pEmploye)
{
return pEmploye.display(os);
}
对于层次结构的基础,
在其中调用受保护的成员函数virtual display(),该函数被每个派生类覆盖,并且将显示委托给该成员.这有时称为NVI(非虚拟接口)惯用语.它是这样的:
class Employee
{
// ...
friend ostream& operator<<(ostream& os, const Employee& pEmployee)
{
return pEmployee.display(os);
}
protected:
virtual ostream& display(ostream& os) const
{
// implement it here
return os;
}
};
class Teacher: public Employee
{
// ....
protected:
ostream& display(ostream& os) const override
{
// implement it here
return os;
}
};
标签:c,operator-overloading,inheritance 来源: https://codeday.me/bug/20191011/1890465.html