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

C++ access a derived class method using a base class pointer

本文关键字:访问 派生 类方法 指针 基类 C++      更新时间:2023-10-16

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

也不应该。如果您希望通过 Base 的接口与所有Derived进行交互,那么您想要对Derived执行的所有操作都必须由 Base 的接口表示。

一般来说,C++(以及大多数面向对象的语言)试图阻止向下转换(将基类型转换为派生类型)。如果您绝对需要,您可以使用dynamic_cast将员工投射到经理。但是,仅当您确定指针实际上指向经理时,才执行此操作。如果没有强制转换,则只能访问基类型的接口。

您可以按如下方式使用这些dynamic_cast:

manager* m = dynamic_cast<manager*>(emps[0]);

一种选择是在基类中为 get_workhour() 提供一个空方法,然后让管理器类覆盖它。