Несоответствие «этого» адреса, когда базовый класс не является полиморфным, а производным, равно

Есть этот код:

#include <iostream>

class Base
{
public:
    Base() {
        std::cout << "Base: " << this << std::endl;
    }
    int x;
    int y;
    int z;
};

class Derived : Base
{
public:
    Derived() {
        std::cout << "Derived: " << this << std::endl;
    }

    void fun(){}
};

int main() {
   Derived d;
   return 0;
}

Выход:

Base: 0xbfdb81d4
Derived: 0xbfdb81d4

Однако, когда функция «fun» изменяется на виртуальную в производном классе:

virtual void fun(){} // changed in Derived

Тогда адрес this не совпадает в обоих конструкторах:

Base: 0xbf93d6a4
Derived: 0xbf93d6a0

Другое дело, если класс Base полиморфен, например я добавил туда какую-то другую виртуальную функцию:

virtual void funOther(){} // added to Base

затем адреса обоих «этих» снова совпадают:

Base: 0xbfcceda0
Derived: 0xbfcceda0

Вопрос -в том, почему «этот» адрес различается в базовом и производном классе, если базовый класс не полиморфен, а производный класс полиморфен?

9
задан curiousguy 24 July 2012 в 17:09
поделиться