Итак, пример!
#include <iostream> void foo(); void foo(int); void main() { foo(7); foo(); } void foo() { std::cout << "We are in foo()"; } void foo(int a) { std::cout << "We are in foo(int)"; }В данном случае компилятор без труда определит, какую версию перегруженной функции надо вызвать Теперь обратимся к классам. Пример:
class B1 { public: void g(int) { } }; class B2 { public: void g() { } }; class: public B1, public B2 { public: int i; }; void main() { D dobj; D *dptr = &dobj; dptr->g(); dptr->g(3); }Эта программа некорретна. Компилятор выдаст нам ошибку, ссылаясь на неоднозначность функции g(). Но почему? В классе B1 имеем g(int), в классе B2 имеем g(), класс D наследует B1 и B2, в итоге должны иметь в классе D перегруженную функцию с двумя версиями. Они различаются параметрами, согласно правилу перегрузки, все должно быть гладко, но... тем не менеее ошибка! А дело тут в компиляторе, как уже все догадались. из-за того, что проверка на наличие неоднозначностей происходит во время компиляции, т.е. перед проверками контроля доступа и типов. Поэтому неоднозначность может быть даже тогда, когда один из нескольких членов с одним и тем же именем может быть доступен из производного класса. Исправить ситуацию можно явно указав принадлежность с помощью "::"
class B1 { public: void g(int) { } }; class B2 { public: void g() { } }; class D : public B1, public B2 { public: int i; B1::g; B2::g; }; int main() { D dobj; D *dptr = &dobj; dptr->g(); dptr->g(3); }
Комментариев нет :
Отправить комментарий