Помогите, плиз, разобраться со статическими переменными-членами класса. Неожиданно для себя столкнулся с тем, что эта тема гораздо более головоломная, чем казалась с самого начала. Например, выяснилось, что значение статической переменной-члена класса разделяется не только между всеми объектами класса, в котором она определена, но и всеми объектами классов-наследников данного класса. Хотелось бы получить объяснение работы следующей программы, т.к. она работает не так, как я от нее ожидаю:
| Код | #include "stdafx.h" #include <iostream>
using std::cout; using std::endl;
class cBasic { public: int h_GetVar(); static int h_TestVar; };
class cTest : public cBasic { public: int h_GetVar_2(); static int h_TestVar; };
int cBasic::h_TestVar = 333; int cTest::h_TestVar = 444;
int cBasic::h_GetVar() { return h_TestVar; }
int cTest::h_GetVar_2() { return h_TestVar; }
int _tmain(int argc, _TCHAR* argv[]) { cBasic x; cTest y; cout << x.h_GetVar() << endl; cout << y.h_GetVar() << endl; // <<< Здесь выводится не то, что я ожидаю... cout << y.h_GetVar_2() << endl; cout << cBasic::h_TestVar << endl; cout << cTest::h_TestVar << endl;
system("PAUSE"); return 0; }
|
В этой программе я попытался сделать так, чтобы значение статической переменной h_TestVar не разделялось между классами cBasic и cTest. Собственно, непонятка происходит в строке, которая отмечена комментарием. Непонятка заключается в том, что метод h_GetVar() класса cTest возвращает значение не той статической переменной которой требуется. Раз этот метод вызывается в классе cTest, то я ожидаю, что он вернет мне значение статической переменной h_TestVar, которая объявлена в этом классе. Вместо этого, мне возвращается значение статической переменной h_TestVar, которая объявлена в классе cBasic... Это вообще нормально? Почему так происходит? Разве переменная-член h_TestVar объявленная в классе с Test не должна перекрывать одноименную переменную член из класса cBasic? С другой стороны, метод h_GetVar_2 класса cTest делает то, что я от него и ожидаю, а значит перекрытие статической переменной все таки происходит... |