【问题标题】:A function that takes one of two child classes and calls the same function on them一个函数,它接受两个子类之一并在它们上调用相同的函数
【发布时间】:2012-02-17 00:27:23
【问题描述】:

我有两个类都扩展了父类。我想写一个函数,可以接受任何一个类,但调用 childs 函数。

即:

class employee
{
public:
    employee();
    virtual ~employee();
    int wage;
    int hours;
    virtual int calculatePay() =0;

};

class factoryWorker : public employee
{
    public:
        factoryWorker();
        int calculatePay();
};

class manager : public employee
{
    public:
        manager();
        int calculatePay();
};

在 main.cpp 文件中我有一个函数

int getPay(employee anyTypeOfWorker) {
    return anyTypeOfWorker.calculatePay();
}

但是这个函数总是调用父(员工)calculatePay()函数而不是被覆盖的函数。

谢谢。

【问题讨论】:

  • 您的 main.cpp 无法编译,因为 employee 是抽象的。
  • 注意:您不应该通过值传递employee 实例;这样你会得到object slicing
  • 我无法想象你在说什么,因为 calculatePay() 是“员工”中的纯虚拟方法。即使它具有默认实现,您也必须使用完整的限定方法名称在子类中调用它(employee::calculatePlay())
  • @Fred Larson:没有理由假设他的程序不能仅仅因为他的 getPay 签名而被编译和链接(除了在那个签名中“员工”应该通过指针传递或至少通过参考)。
  • @boto:不能按值传递,因为不能为抽象类创建值。我愿意打赌(如果我是一个赌徒,我不是)OP 的实际代码没有纯虚函数,所以切片就是正在发生的事情。

标签: c++ class inheritance object


【解决方案1】:

按地址传递。

int getPay(employee* anyTypeOfWorker) {
    return anyTypeOfWorker->calculatePay();
}

【讨论】:

    【解决方案2】:

    如果参数是引用或指向基类的指针,它就可以工作。

    int getPay(employee& anyTypeOfWorker) {
        return anyTypeOfWorker.calculatePay();
    }
    

    如果按值传递,参数将被“切片”为声明的参数类型。

    【讨论】:

      【解决方案3】:

      你需要传入一个指向“anyTypeOfWorker”的指针,所以它是

      int getPay(employee* anyTypeOfWorker) {
          return anyTypeOfWorker->calculatePay();
      }
      

      有关原因的参考,请查看以下内容

      http://en.wikipedia.org/wiki/Virtual_function

      http://www.cplusplus.com/forum/beginner/13885/

      【讨论】:

        【解决方案4】:

        好吧,您实际上不能调用 employee::calculatePay(),因为它是纯虚拟的,但您的代码尝试的原因是对象在将其复制到getPay() 的堆栈帧的过程。

        您需要传递一个指针或引用,以便getPay() 可以访问调用者的实际factoryworkermanager 对象。例如:

        int getPay(employee const &anyTypeOfWorker) {
            return anyTypeOfWorker.calculatePay();
        }
        

        【讨论】:

        • 如果通过const引用传递参数,则不能调用非const成员函数。
        • 糟糕,你说得对,我忽略了这一点。 calculatePay() 无论如何都应该声明为 const。
        猜你喜欢
        • 1970-01-01
        • 2019-04-02
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 2020-07-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多