LinuxForum.Fans
Тема

Начинающий. Конструктор из базового класса

Автор: aivs 5 сообщений 1651 просмотров
#241476

Я только учу С++ и возник вопрос по конструкторам в производном классе.
Есть пример базового и производного класса, если в производном классе не определен никакой конструктор, и после создается объект ничем не инициализированный, то используется конструктор из базового класса, а если создать объект с инициализацией, то уже нужен конструктор в производном классе, почему не используется конструктор с одним параметром из базавого класса??
Язык изучаю по Лафоре.

text
class A // базовый класс
{
protected:
    int number; // переменная
public:
    // конструктор без параметров
    A(): number(0) // переменная инициализируется нулем
    {}

// конструктор c одним параметром A(int num): number(num) // переменная инициализируется значением num {} }; ////////////////////////////////// class B : public A // производный класс {}; // ничего не делает ///////////////////////////////// main() { B b1; // создаю объект b1 без параметра // конструктор используется из class A B b2=3; // инициализирую объект b2 числом 3 // так нельзя, потому что нужен конструктор в class B, почему нельзя взять из базового класса? return 0; }

#241506
"aivs" написал:
B b1; // создаю объект b1 без параметра // конструктор используется из class A

на самом деле тут используется конструктор по умолчанию B::B(), который в свою очередь вызывает конструктор класса A.

"aivs" написал:
B b2=3;

а такого конструктора просто нет: ни вы его не определили ни компилятор.

#241514

т.е. если создается объект без параметров и в классе не определен конструктор, то используется конструктор по умолчанию определенный компилятором, который обращается к базовому классу.
А почему нельзя сделать так, что если в производном классе нет нужного конструктора, но он есть в базовом, то передать параметры в базовый конструктор?
так же происходит с методами, если в производном классе нет метода, то он ищется в базовом.

#241515
text

class A
{
protected:
    int number;
public:
    A(): number(0)
    {}

A(int num): number(num) {} };

class B : public A { private: std::string b; public: B(std::string _b): b(_b) {} };

допустим было бы по вашему... чем тогда стоило бы инициализировать b?
собственно во избежании такой неоднозначности это и запрещено...

#241531

Понял, в производном классе всегда нужно однозначно определять конструктор.

Войдите или зарегистрируйтесь, чтобы ответить.