используя перегруженную функцию базового класса - PullRequest
4 голосов
/ 23 ноября 2011

Я пытаюсь сделать что-то вроде

class base {
public:
    virtual double operator() (double val) = 0;
    virtual double operator() (double prev, double val) {
        return prev + operator()(val);
    }
};

class derived: public base {
    virtual double operator() (double val) {
        return someting_clever;
    }
};

Я хочу перегрузить оператор (), чтобы использовать его с различными алгоритмами, такими как std :: аккумулировать или std :: transform.Я полностью доволен определением оператора базового класса () (double, double).Однако я не могу назвать это из производного класса.Нужно ли переписывать один и тот же код для каждого класса, производного от базы?

Ответы [ 2 ]

6 голосов
/ 23 ноября 2011

Проблема здесь в том, что определение функции в производном классе скрывает ту же функцию в базовом классе; по этой причине вы не можете получить доступ к operator()(double, double) из производного класса.

Но есть способ сделать это: вы можете просто использовать директиву using в своем производном классе:

class derived: public base {
    using base::operator();
    virtual double operator() (double val) {
        return someting_clever;
    }
};
3 голосов
/ 23 ноября 2011

Вы пробовали использовать директиву?

class derived: public base {
    virtual double operator() (double val) {
        return someting_clever;
    }
    using base::operator();
};
...