Вот небольшой пример, показывающий, что происходит:
- А инициализирует х в 10
- B инициализирует х в 20
ниже вы можете увидеть, как работают вызовы виртуальных функций и как работает вызов вашего родителя (даже если вы инициализировали значение по-другому)
самое важное, что нужно иметь в виду, это то, что даже если вы вызываете вашу суперфункцию (A :: GetX), она все равно использует значение из вашего собственного класса (B :: x)
class A
{
public:
A::A() : x(10) {}
virtual int GetX() {return x*2;}
protected:
int x;
};
class B : public A
{
public:
B::B() : A()
{
x = 20;
}
virtual int GetX() {return x;}
};
int _tmain(int argc, _TCHAR* argv[])
{
A* a1 = new A();
B* b1 = new B();
int test1 = a1->GetX(); // returns 20 (because x is 10, but function doubles value)
int test2 = b1->GetX(); // returns 20 (because x is initialized at 20)
return 0;
}
Теперь, если мы изменим B :: GetX на:
virtual int GetX() {return A::GetX();}
Получаем следующий результат:
int _tmain(int argc, _TCHAR* argv[])
{
A* a1 = new A();
B* b1 = new B();
int test1 = a1->GetX(); //returns 20 (as previously)
int test2 = b1->GetX(); // return 40 (x is initialized by B at 20, but then the
// A:GetX is called, which doubles the result)
return 0;
}