Подтвердить что ты не робот

Вызов конструктора базового класса из конструктора производного класса

У меня вопрос:

Скажем, я изначально выбрал эти классы, которые я не могу изменить (скажем, потому что они взяты из библиотеки, которую я использую):

class Animal_
{
public:
    Animal_();
    int getIdA()
    {
        return idA;
    };
    string getNameA()
    {
        return nameA;
    }
private:
    string nameA;
    int idA;
}

class Farm
{
public :
    Farm()
    {
        sizeF=0;
    }
    Animal_* getAnimal_(int i)
    {
        return animals_[i];
    }
    void addAnimal_(Animal_* newAnimal)
    {
        animals_[sizeF]=newAnimal;
        sizeF++;
    }

private:
    int sizeF;
    Animal_* animals_[max];
}

Но тогда мне нужен класс, где я просто добавляю пару полей, поэтому я сделал это:

class PetStore : public Farm
{
public :
    PetStore()
    {
     idF=0;
    };
private:
    int idF;
    string nameF;
}

Но я не могу инициализировать свой производный класс, я имею в виду, что я сделал это наследование, чтобы добавить животных в свой PetStore, но теперь, поскольку sizeF является приватным, как я могу это сделать? Я думаю, возможно, в конструкторе по умолчанию для PetStore, который я могу назвать Farm()... так что любая идея?

4b9b3361

Ответ 1

Конструктор PetStore вызовет конструктор Farm; есть вы не можете предотвратить это. Если вы ничего не сделаете (как вы это сделали), это будет вызовите конструктор по умолчанию (Farm()); если вам нужно передать аргументы, вам нужно будет указать базовый класс в списке инициализаторов:

PetStore::PetStore()
    : Farm( neededArgument )
    , idF( 0 )
{
}

(Аналогично, конструктор PetStore вызовет конструктор nameF. Конструктор класса всегда вызывает конструкторы все его базовые классы и все его члены.)

Ответ 2

Во-первых, PetStore не является фермой.

Пусть все пройдет. Фактически вам не нужен доступ к закрытым членам, у вас есть все, что вам нужно в открытом интерфейсе:

Animal_* getAnimal_(int i);
void addAnimal_(Animal_* newAnimal);

Это методы, к которым вы получили доступ, и это те, которые вы должны использовать.

Я имею в виду, что я сделал это наследование, чтобы добавить животных в свой PetStore, но теперь, поскольку sizeF является приватным, как я могу это сделать?

Простой, вы вызываете addAnimal. Он public, и он также увеличивает sizeF.

Также обратите внимание, что

PetStore()
{
 idF=0;
};

эквивалентно

PetStore() : Farm()
{
 idF=0;
};

то есть. вызывается базовый конструктор, инициализируются базовые элементы.

Ответ 3

Конструктор базового класса уже автоматически вызывается конструктором производного класса. В С++, если базовый класс имеет конструктор по умолчанию (не принимает никаких аргументов, может быть автоматически сгенерирован компилятором!), А конструктор производного класса не вызывает другой конструктор базового класса в его списке инициализации, конструктор по умолчанию будет называться. То есть ваш код эквивалентен:

class PetStore: public Farm
{
public :
    PetStore()
    : Farm()     // <---- Call base-class constructor in initialision list
    {
     idF=0;
    };
private:
    int idF;
    string nameF;
}

Ответ 4

но я не могу инициализировать свой производный класс, я имею в виду, что я сделал это наследование поэтому я могу добавить животных в свой PetStore, но теперь, поскольку sizeF является приватным, как Я могу это сделать?? поэтому я думаю, возможно, в настройке PetStore по умолчанию конструктор Я могу вызвать Farm()... так что любая идея???

Не паникуйте.

Конструктор фермы будет вызываться в конструкторе PetStore, автоматически.

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

Ответ 5

Вызов базового конструктора в производном конструкторе

Примечание. Если мы не используем ключевое слово super(), оно вызывает конструктор по умолчанию Base Class, который в этом случае является незаконным как здесь Базовый класс Конструктор принимает три аргумента.
Таким образом, становится необходимым использовать ключевое слово super() с нужными аргументами.
<Б > Помните:
1). Из класса вне класса конструктор всегда вызывается с новым оператором.
2). Изнутри класса он может быть вызван через ключевое слово this() ИЛИ super().
3). Это() ключевое слово может использоваться для вызова другого конструктора из того же класса (см. Понятие внутреннего класса).
4). В отличие от других методов (например, функции()), конструкторы не унаследованы.
5). Если вы называете Имя метода базового класса То же, что и для Имя метода производного класса, тогда   базовый класс будет вызываться not.
6). Когда вы создаете объект Производный класс, сначала запускается конструктор базового класса (см. Ниже).

class demo
{
    public static void main(String args[])
    {   
        derived1 d1=new derived1("Tom","Dad",21,"Programming","Cooking");
        derived2  d2=new derived2("Tom","Dad",21,500);

    d1.baseDisplay();//Calling Base class baseDisplay() via derived class object
        d1.display();

    d2.baseDisplay();//Calling Base class baseDisplay() via derived class object
        d2.display();
    }
}

class base
{
    private
    String name;
    String fatherName;
    int age;
    String interest;
    String hobby;
    int piggyBankAmount;
    base(String name,String fatherName,int age)
    {
        this.name=name;
        this.fatherName=fatherName;
        this.age=age;
    }

    public void baseDisplay()
    {
        System.out.println("Name:"+name+"\nFather Name:"+fatherName+"\nAge:"+age);
    }

}


class derived1 extends base
{   /* String interest;         Note we inherited these data members from Base Class
        String hobby;   */
    derived1(String name,String fatherName,int age,String interest,String hobby)
    {
        super(name,fatherName,age);
        this.interest=interest;
        this.hobby=hobby;
    }

    public void display()
    {
        System.out.println("Hobby:"+hobby+"\nInterest:"+interest);

    }


}

class derived2 extends base
{         //int piggyBankAmount;  Note we inherited this data member from Base Class
    derived2(String name,String fatherName,int age,int piggyBankAmount)
    {
        super(name,fatherName,age);
        this.piggyBankAmount=piggyBankAmount;

    }

    public void display()
    {
        System.out.println("piggyBankAmount:"+piggyBankAmount);
    }


}

Вывод:

  Name:Tom
  Father Name:Dad
  Age:21
  Hobby:Cooking
  Interest:Programming
  Name:Tom
  Father Name:Dad
  Age:21
  piggyBankAmount:500

Программа для отображения конструктора базового класса выполняется сначала при создании объекта класса

    class demo
    {
        public static void main(String args[])
        {   
            derived1 d1=new derived1("Tom","Dad",21,"Programming","Cooking");
            derived2  d2=new derived2("Tom","Dad",21,500);

            d1.display();
            d2.display();
        }
    }

    class base
    {
        private
        String name;
        String fatherName;
        int age;
        String interest;
        String hobby;
        int piggyBankAmount;
        base(String name,String fatherName,int age)
        {
            this.name=name;
            this.fatherName=fatherName;
            this.age=age;

            System.out.println("Name:"+name+"\nFather Name:"+fatherName+"\nAge:"+age);//See Constructor of Base class runs first
        }



    }


    class derived1 extends base
    {   /* String interest;         Note we inherited these data members from Base Class
            String hobby;   */
        derived1(String name,String fatherName,int age,String interest,String hobby)
        {
            super(name,fatherName,age);
            this.interest=interest;
            this.hobby=hobby;
        }

        public void display()
        {
            System.out.println("Hobby:"+hobby+"\nInterest:"+interest);

        }


    }

    class derived2 extends base
    {         //int piggyBankAmount;  Note we inherited this data member from Base Class
        derived2(String name,String fatherName,int age,int piggyBankAmount)
        {
            super(name,fatherName,age);
            this.piggyBankAmount=piggyBankAmount;

        }

        public void display()
        {
            System.out.println("piggyBankAmount:"+piggyBankAmount);
        }


    }

Вывод:

    Name:Tom
    Father Name:Dad
    Age:21
    Name:Tom
    Father Name:Dad
    Age:21
    Hobby:Cooking
    Interest:Programming
    piggyBankAmount:500