Откуда класс берет значения переменных?

У меня есть класс First и его наследник Second, у них разные конструкторы. Откуда класс Second берет значения 2 и 3, если инициализирован только обьект second класса Second? Получается неявно создается класс First и запускается его конструктор? Объясните.
Еще вопрос: пишут так class a: public A - зачем пишут слово public, protected или private если можнго писать просто class a: A?

Вод код для первого вопроса:
#include <iostream>

using namespace std;

class First {
private:
    int private_value;
protected:
    int protected_value;
public:
    int public_value;
    
    First(void) {
        private_value=1;
        protected_value=2;
        public_value=3;
    }
};

class Second: First {
private:
protected:
public:
    Second(void) {
        cout<<protected_value<<endl;
        cout<<public_value;
    }
};

int main(void) {
    Second second;
}
  • Вопрос задан
  • 176 просмотров
Решения вопроса 2
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
1. Создание наследника означает создание и вызов конструкторов всех его родителей. Наследник всегда содержит в себе родителя.
2. Ненаписанный спецификатор доступа означает private.
Ответ написан
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
Получается неявно создается класс 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 обязательно. В чем разница - смотрите в литературу.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы