Метод / оператор перегрузки с наследованием не будет работать - PullRequest
3 голосов
/ 03 июня 2011

Я написал код, когда один класс имеет только постоянный доступ к своему содержимому, и он был унаследован другим классом, который предоставляет тот же метод, но с обычным доступом к его членам.Когда я пытаюсь скомпилировать его с помощью gcc, я получаю следующий код ошибки:

error: passing ‘const A’ as ‘this’ argument of ‘void A::operator()()’ discards qualifiers 

вот пример скомпилированного кода:

#include<stdio.h>

class ConstA {
    public:
        void operator()() const {
            printf("const\n");
        }
};

class A : public ConstA {
    public:
        void operator()() {
            printf("non-const\n");
        }
};

class B : public A {
};

void f(const A& a) {
    a();
}

int main() {
    B b;
    f(b);
}

Компилятор пытается вызвать метод (operator ()) безатрибут, а метод const доступен в базовом классе ConstA.Я не знаю, почему я получаю такую ​​ошибку.

Ответы [ 2 ]

10 голосов
/ 03 июня 2011

Метод const недоступен, версия базового класса скрыта версией производного класса, досадная проблема. Вам нужно using ConstA::operator(), чтобы вывести его в область действия A.

class A : public ConstA{
public:
  using ConstA::operator();

  void operator()(){
    printf("non-const\n");
  }
};

Для дальнейшего чтения, посмотрите на мой вопрос , который имеет несколько хороших объяснений.

2 голосов
/ 03 июня 2011

это потому, что C ++ использует hiding при перегрузке, поэтому после перегрузки ConstA :: operator () НЕ доступен
рассмотрим следующую программу:

class A {
public:
    void foo() { cout << "A" << endl; }
};
class B : public A {
public:
    void foo(int x) { cout << "B" << endl; }
};
int main() {
    B b;
    b.foo();
}

этот также вызовет ошибку компиляции, потому что B :: foo () скрыт! чтобы вызвать его, вам придется явно привести к A.
так что в вашем примере вам придется явно привести к ConstA

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