Перегрузка оператора ()
От: st0nx  
Дата: 11.06.11 13:33
Оценка:
Имеется вот такой код:
#include <iostream>

using namespace std;


class A
{
    public:
    virtual int XplusY(int x, int y) = 0;
    virtual int operator() (int x, int y)
    {
        return XplusY(x,y);
    };
};

class B : public A
{
 public:
    int XplusY(int x, int y)
    {
        return x+y;
    };
    double XplusY(int x1, int x2,int y)
    {
        return x1*x2+y;
    };
    int operator () (int x1, int x2,int y)
    {
     return XplusY(x1,x2,y);
    };
};


int main(int argc, char* argv[])
{

            B b;
            double x1,x2;
            x1 = 12;
            x2 = 32;
            std::cout<<b(x1,x2);
            return 0;
}

при компиляции возникает следующая ошибка:

/home/kubik/C++ Project/test1/main.cpp||In function ‘int main(int, char**)’:|
/home/kubik/C++ Project/test1/main.cpp|43|error: no match for call to ‘(B) (double&, double&)’|
/home/kubik/C++ Project/test1/main.cpp|29|note: candidate is: int B::operator()(int, int, int)|
||=== Build finished: 2 errors, 0 warnings ===|


Если закоментировать перегрзку оператора в дочернем классе то все нормально вызывается. Перегрузка в дочернем тоже нормально вызывается. МОжно ли как то это решить?
Re: Перегрузка оператора ()
От: const_volatile  
Дата: 11.06.11 14:01
Оценка:
Здравствуйте, st0nx, Вы писали:

S>Имеется вот такой код:

S>
S>class B : public A
S>{
S> public:
S>    int XplusY(int x, int y)
S>    {
S>        return x+y;
S>    };
S>    double XplusY(int x1, int x2,int y)
S>    {
S>        return x1*x2+y;
S>    };
S>    int operator () (int x1, int x2,int y)
S>    {
S>     return XplusY(x1,x2,y);
S>    };

      using A::operator();
S>};
S>
Re: Перегрузка оператора ()
От: Centaur Россия  
Дата: 12.06.11 08:34
Оценка:
Здравствуйте, st0nx, Вы писали:

S>class A
S>{
S>    public:
S>    virtual int operator() (int x, int y)
S>    {
S>        return XplusY(x,y);
S>    };
S>};

S>class B : public A
S>{
S> public:
S>    int operator () (int x1, int x2,int y)
S>    {
S>     return XplusY(x1,x2,y);
S>    };
S>};


S>Если закоментировать перегрзку оператора в дочернем классе то все нормально вызывается.


Это не перегрузка, это сокрытие.

А кроме того, в базовом классе совершенно незачем делать operator() виртуальным, раз он простой форвардер к виртуальной функции. И напротив, виртуальную функцию XplusY незачем делать публичной, раз к ней есть публичный форвардер operator().
Re: Перегрузка оператора ()
От: Result  
Дата: 12.06.11 11:37
Оценка:
class B : public A
{
 public:
    int XplusY(int x, int y)
    {
        return x+y;
    };
    double XplusY(int x1, int x2,int y)
    {
        return x1*x2+y;
    };
    double operator () (int x1, int x2,int y)
    {
     return XplusY(x1,x2,y);
    };
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.