Рассмотрим:Переопределение виртуального метода, отличного от const, скрывает перегрузку константы?
#include <iostream>
using namespace std;
struct A {
virtual void f() { cout << "A::f" << endl; }
virtual void f() const { cout << "A::f const" << endl; }
};
struct B : public A {};
struct C : public A {
virtual void f() { cout << "C::f" << endl; }
};
int main()
{
const B b;
b.f(); // prints "A::f const"
const C c;
c.f();
// Compile-time error: passing ‘const C’ as ‘this’ argument of
// ‘virtual void C::f()’ discards qualifiers
}
(. Я использую GCC)
Таким образом, кажется, что сопзИте версию F() получает скрытый в C. Это делает много смысла для меня, но он санкционирован стандартом?
«Виртуальный» - это красная сельдь. Мы не вызываем никаких 'f' фактически (через указатель базового класса или ссылку) здесь. Все поиски 'f' находят наиболее производные' f'. – MSalters
Виртуальные и константы на самом деле не применимы к вопросу, но я оставил их как теги, так как я не вижу большого вреда и не нуждаюсь в добавлении более релевантного тега. – 2010-11-11 09:53:16
Я согласен с 'virtual', но' const' - вот о чем весь вопрос. Переопределение 'f()' скрывает 'f() const'. – Ari