Функция, которая принимает один из двух дочерних классов и вызывает для них одну и ту же функцию - PullRequest
1 голос
/ 23 января 2012

У меня есть два класса, которые оба расширяют родительский класс. Я хочу написать функцию, которая может принимать любой класс, но вызывает функцию 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();
}

Но эта функция всегда вызывает родительскую (сотрудник) функцию calcPay (), а не переопределяемые функции.

Спасибо.

Ответы [ 4 ]

1 голос
/ 23 января 2012

Ну, на самом деле вы не можете вызвать employee::calculatePay(), поскольку он чисто виртуальный, но причина, по которой ваш код пытается , состоит в том, что объект "нарезается" до employee в процессескопировать его в кадр стека getPay().

Вам необходимо передать указатель или ссылку, чтобы getPay() мог получить доступ к фактическому объекту factoryworker или manager вызывающей стороны.Например:

int getPay(employee const &anyTypeOfWorker) {
    return anyTypeOfWorker.calculatePay();
}
1 голос
/ 23 января 2012

Работает, если параметр является ссылкой или указателем на базовый класс.

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

Если вы передадите по значению, параметр будет «нарезан» на объявленный тип параметра.

1 голос
/ 23 января 2012

передать по адресу.

int getPay(employee* anyTypeOfWorker) {
    return anyTypeOfWorker->calculatePay();
}
0 голосов
/ 23 января 2012

Вам нужно передать указатель на «anyTypeOfWorker», так что это будет

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

Для справок, пожалуйста, взгляните на следующее

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...