C ++使用基类指针访问派生类方法

时间:2015-04-28 16:03:25

标签: c++ inheritance polymorphism

我正在尝试访问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;
    }

3 个答案:

答案 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()设置一个空方法,并让管理器类覆盖它。