c++ - 代码 C++ 中的动态多态性错误

标签 c++ dynamic polymorphism

#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 的所有派生类必须实现所有 纯虚方法,否则无法实例化。

为什么会这样?

派生类从基类继承所有方法(和成员变量)。

在你的例子中,基类有一些纯虚方法,因此子类(EngineerManager主任)也是如此。非抽象类不能有纯虚方法,因此为了实例化这些类,每个类都应该实现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/

相关文章:

c++ - CRTP 中未实现的派生函数

c++ - 将 GUI 从 glade 导入 code::blocks

javascript - 如何在我的 jquery 菜单中的 li 项下添加一行?

android - 如何将自定义参数传递给 onClick 监听器

java - 动态方法调度和运行时多态性错误

c++ - 离散数学到 C++

c++ - 二项分布压缩

json - 类型 'List<dynamic>' 不是类型 'List<int>' 的子类型,其中

Java:参数化Map对象

java - Swing 中的多态性