У меня есть фрагмент кода ниже:Override поле член в производных классах
#include <iostream>
using namespace std;
class Base {
public:
Base() : b(0) {}
int get();
virtual void sayhello() { cout << "Hello from Base with b: " << b << endl; }
private:
int b;
};
int Base::get() {sayhello(); return b;}
class Derived : public Base {
public:
Derived(double b_):b(b_){}
void sayhello() { cout << "Hello from Derived with b: " << b << endl; }
private:
double b;
};
int main() {
Derived d(10.0);
Base b = d;
cout << "Derived b: " << d.get() << endl;
cout << "Base b: " << b.get() << endl;
}
Запустите скомпилированный исполняемый файл, и я нахожу результат из моих ожиданий на моем LLVM-г ++ 4.2 машины. Выход на моей коробке как
Hello from Derived with b: 10
Derived b: 0
Hello from Base with b: 0
Base b: 0
То, что я хочу сделать в коде, чтобы переопределить член поля (b
) в Derived
классе. Поскольку я думаю, что Base
и Derived
необходимо получить к этому полю, я определяю функцию-член get
в Base
, таким образом Derived
может наследовать его. Затем я пытаюсь получить поле участника из разных объектов.
Результат показывает, что я до сих пор получить оригинальный b
в Base
по d.get()
вместо того, что в Derived
, что то, что я ожидал, что код делать. Что-то не так с кодом (или моим пониманием)? Указано ли это поведение в спецификации? Каков правильный способ переопределить поле члена и правильно определить его getter и setter?
Почему этот результат не соответствует вашим ожиданиям? Вы скрываете 'B :: b' от' D', если он не квалифицирован. Но скрытый, инициализированный элемент B :: b 'D' копируется так, как он должен быть установлен по умолчанию copy-ctor' B', как и должно быть. Ваши базовые классы не просто начинают использовать свои не скрытые производные переменные класса класса с помощью своего рода осмоса. Они даже не знают, что они там. – WhozCraig