почему и конструктор базового класса, и класс Drive запускаются при инициализации экземпляра класса Drive

#include <iostream>
using namespace std;

class Base {
    public:
        Base() {
            cout << "In Base" << endl;
            cout << "Virtual Pointer = " << (int*)this << endl;
            cout << "Address of Vtable = "
            << (int*)*(int*)this << endl;
            cout << "Value at Vtable = "
            << (int*)*(int*)*(int*)this << endl;
            cout << endl;
        }

        virtual void f1() { cout << "Base::f1" << endl; }
};

class Drive : public Base {
    public:
        Drive() {
            cout << "In Drive" << endl;
            cout << "Virtual Pointer = "
            << (int*)this << endl;
            cout << "Address of Vtable = "
            << (int*)*(int*)this << endl;
            cout << "Value at Vtable = "
            << (int*)*(int*)*(int*)this << endl;
            cout << endl;
        }

        virtual void f1() { cout << "Drive::f2" << endl; }
};

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

Вывод этой программы

In Base
Virtual Pointer = 0012FF7C
Address of Vtable = 0046C08C
Value at Vtable = 004010F0

In Drive
Virtual Pointer = 0012FF7C
Address of Vtable = 0046C07C
Value at Vtable = 00401217

на мой взгляд, просто запускается конструктор класса Drive, когда я инициализирую экземпляр Drive, но в этой программе также запускается код в конструкторе Base. И следите за выводом, есть такая странная вещь, у нас есть только 1 экземпляр, 1 виртуальный указатель, но у нас есть 2 Vtable.


person cao_bang    schedule 04.06.2012    source источник
comment
Какой у Вас вопрос? Из того, что я могу сделать, вам нужно прочитать о наследовании.   -  person nikhil    schedule 04.06.2012
comment
Речь идет о виртуальном указателе и vtable. почему у нас всего 1 виртуальный указатель, а 2 вталбе?   -  person cao_bang    schedule 04.06.2012


Ответы (1)


Потому что, когда вы запускаете конструктор унаследованного класса, конструктор его суперкласса запускается автоматически. Это похоже на то, что ваш компилятор поместил для вас призыв к конструктору Base в первой строке вашего конструктора Drive. Для вашего компилятора конструктор Drive выглядит примерно так:

    Drive() {
        Base();
        cout << "In Drive" << endl;
        cout << "Virtual Pointer = "
        << (int*)this << endl;
        cout << "Address of Vtable = "
        << (int*)*(int*)this << endl;
        cout << "Value at Vtable = "
        << (int*)*(int*)*(int*)this << endl;
        cout << endl;
    }
person Stefana Fratean    schedule 04.06.2012
comment
какая проблема, если я просто хочу запустить конструктор Drive. Могу ли я это сделать? - person cao_bang; 04.06.2012
comment
Да, вы можете, не наследуя от базового класса - person nikhil; 04.06.2012
comment
Не наследуйте класс Base, иначе конструктор из Base не запустится. - person Stefana Fratean; 04.06.2012