Получается неявно создается класс First и запускается его конструктор?
Нет, класс не создается, но запускается конструктор базового класса. Если после конструктора наследника не указываете запуск конструктора базового класса, то вызывается конструктор базового класса по умолчанию
Вот это:
Second() {}
Тоже самое что это:
Second() : First() {}
Пример для проверки:
#include <iostream>
using namespace std;
class First {
public: First() { cout << "First constructor" << endl; }
};
class Second : public First {
public: Second() { cout << "Second constructor" << endl; }
};
int main() {
Second second;
system("pause");
}
Попробуйте переписать класс так и получите ошибку компиляции:
class First {
public: First(const char* msg) { cout << msg << endl; }
private: First() { cout << "First" << endl; }
};
Еще вопрос: пишут так class a: public A - зачем пишут слово public, protected или private если можно писать просто class a: A?
Если вы не указываете тип наследования, то применяется private по умолчанию. Т.е. private можно не указывать, а то public и protected обязательно. В чем разница - смотрите в литературу.