#include <iostream>
#include <string>
using namespace std;
class Employee
{
public :
virtual int calculateSalary()= 0;
virtual string getName()=0;
virtual string getEngineer()=0; //error
virtual string getManager()=0; /error
virtual string getDirector()=0; /error
};
class Engineer: public Employee
{
protected:
string name;
int salary;
public:
Engineer(string n,int s):name(n),salary(s){ cout<<endl<<"Engineer Created"; }
~Engineer(){cout<<endl<<"engineer destroyed";}
int calculateSalary()
{
return salary * 2;
}
string getName()
{
return name;
}
string getEngineer()
{
return "Engineer";
}
};
class Manager:public Engineer
{
public:
Manager(string n,int s): Engineer(n,s) { cout<<endl<<"Manager Created"; }
~Manager(){cout<<endl<<"MANAGER destroyed";}
int calculateSalary()
{
return salary * 3;
}
string getName()
{
return name;
}
string getManager()
{
return "manager";
}
};
class Director:public Manager
{
public:
Director(string n,int s): Manager(n,s) { cout<<endl<<"Director Created"; }
~Director(){cout<<endl<<"Director destroyed";}
int calculateSalary()
{
return salary * 4;
}
string getName()
{
return name;
}
string getDirector()
{
return "director";
}
};
int main()
{
Engineer e1("rohit",20000),e2("soham",21000);
Manager m1("shyam",23000),m2("ram",23500);
Director d1("rahul",25000);
Employee *staff[] = {&e1,&e2,&m1,&m2,&d1};
for(int i=0;i<5;i++)
{
cout<<endl<<"Name : "<<staff[i]->getName() << "\t" << "Salary : " << staff[i]->calculateSalary();
}
cout<<endl<<staff[0]->getEngineer(); //error
cout<<endl<<staff[1]->getEngineer(); //error
cout<<endl<<staff[2]->getManager(); //error
cout<<endl<<staff[3]->getManager(); //error
cout<<endl<<staff[4]->getDirector(); //error
return 0;
}
/如果我编译这段代码,有错误的行会显示错误。 我想知道是否可以通过工作人员指针访问 getEngineer()、getManager()、getDirector()。 如果是,那么如何? 如果不是,那为什么呢? 是否有任何替代方法可以访问那些保持员工数据类型不变的功能(即员工)?/
最佳答案
Employee
的所有派生类必须实现所有 纯虚方法,否则无法实例化。
为什么会这样?
派生类从基类继承所有方法(和成员变量)。
在你的例子中,基类有一些纯虚方法,因此子类(Engineer
、Manager
和 主任
)也是如此。非抽象类不能有纯虚方法,因此为了实例化这些类,每个类都应该实现getEngineer()
getManager()
getDirector()
方法。
解决方案是什么?
您的问题是错误的设计决策。 基类应该代表所有派生类的统一接口(interface)。
这就是为什么基类 Employee
不应该有像 getEngineer()
这样的方法,这是一个更具体的信息。
IMO,更好的设计决策(仅查看您的代码)可能是:
class Employee {
public :
virtual int calculateSalary() = 0;
virtual string getName() = 0;
virtual string getTypeWork() = 0;
};
以这种方式(利用多态性属性)每个派生类都可以正确地返回表示其角色工作的字符串。
关于c++ - 代码 C++ 中的动态多态性错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39317517/