по какой причине эта программа:C++ - сопзЬ ключевое слово в методах и перегрузки
#include <iostream>
using namespace std;
class Base {
public:
Base() { cout << "Costruttore Base" << endl; }
virtual void foo(int) { cout << "Base::foo(int)" << endl; }
virtual void bar(int) { cout << "Base::bar(int)" << endl; }
virtual void bar(double) { cout << "Base::bar(double)" << endl; }
virtual ~Base() { cout << "Distruttore Base" << endl; }
};
class Derived : public Base {
public:
Derived() { cout << "Costruttore Derived" << endl; }
void foo(int) { cout << "Derived::foo(int)" << endl; }
void bar(int) const { cout << "Derived::bar(int)" << endl; }
void bar(double) const { cout << "Derived::bar(double) const" << endl; }
~Derived() { cout << "Distruttore Derived" << endl; }
};
int main() {
Derived derived;
Base base;
Base& base_ref = base;
Base* base_ptr = &derived;
Derived* derived_ptr = &derived;
cout << "=== 1 ===" << endl;
base_ptr->foo(12.0);
base_ref.foo(7);
base_ptr->bar(1.0);
derived_ptr->bar(1.0);
derived.bar(2);
return 0;
}
В вызове base_ptr->bar(1.0);
называется Base::bar(double)
, а в derived_ptr->bar(1.0);
называется Derived::bar(double) const
.
Я понял, что это ключевое слово const
, но я не понимаю, почему компилятор выбирает разные перегруженные функции.
Если удалить const
ключевое слово, все работает, как ожидалось, вызвав в обоих случаях Derived::bar
Используйте ключевое слово 'override', и компилятор скажет вам, что вы не переопределили базовую функцию – WhiZTiM