我正在尝试访问get_workhour()
功能。我该怎么做呢?
多态只适用于覆盖函数吗?
manager
类有一个特殊函数get_workhour()
,它不存在于基类employee
中。当两个类的对象都存储在employee
类型的向量中时,如何使用多态来调用该函数?
#include <iostream>
#include <vector>
using namespace std;
class employee{
protected:
string name;
double pay;
public:
employee(){
name="xyz";
pay =0.0;
}
employee(string name,double pay) {
this->name = name;
this->pay = pay;
}
string get_name(){
return name;
}
virtual double get_pay(){
return pay;
}
};
class manager:public employee{
protected:
int workhour;
public:
manager(){
workhour = 0;
}
manager(string name,double pay,int workhour):
employee(name,pay){
this->workhour = workhour;
}
virtual int get_workhour(){
return workhour;
}
virtual double get_pay() {
return pay + 100;
}
};
int main()
{
employee emp1("vivek",1500);
manager m1("william",1300,10);
vector<employee*> emps;
emps.push_back(&m1);
emps.push_back(&emp1);
cout<<"Name of manager is : "<<emps[0]->get_name()<<endl;
cout<<"Pay for the manager is :"<<emps[0]->get_pay()<<endl;
cout<<"Workhour of manager is : "<<ptr->get_workhour()<<endl;
cout<<"Name of employee is : "<<emps[1]->get_name()<<endl;
cout<<"Pay for the employee is : "<<emps[1]->get_pay()<<endl;
return 0;
}
答案 0 :(得分:3)
你不能也不应该。如果您希望通过Derived
的界面与所有Base
进行互动,那么您要对Derived
执行的所有操作都必须由Base
的界面表示。< / p>
答案 1 :(得分:2)
通常,C ++(和大多数面向对象的语言)试图阻止向下转换(将基类型转换为派生类型)。如果您绝对需要,可以使用dynamic_cast将员工投给经理。但只有当你确定你的指针实际上是指经理时才这样做。如果没有演员表,您只能访问基本类型的界面。
您可以按如下方式使用dynamic_cast:
manager* m = dynamic_cast<manager*>(emps[0]);
答案 2 :(得分:1)
一种选择是在基类中为get_workhour()设置一个空方法,并让管理器类覆盖它。