Каков синтаксис для вызова конструктора значений базового класса с указателем базового класса? - PullRequest
0 голосов
/ 10 февраля 2020

Базовый класс имеет конструктор значений, который принимает аргументы. Он не имеет конструктора по умолчанию.

Следующее использует указатель класса base, который установлен равным адресу некоторого объекта класса derived в куче. Это явно вызывает конструктор значения derived. Есть ли способ явно вызвать конструктор значения base в этой строке? Я понимаю, что альтернативой является то, что конструктор производного класса может вызывать конструктор базового класса.

base *ptr = new derived(args);

1 Ответ

1 голос
/ 10 февраля 2020

Вы можете явно вызвать конструктор значения base в вашей строке следующим образом (но учтите, что списки параметров различаются)

   #include<iostream>

    class Base{

    public:
        Base(int arg){std::cout<<"\nBase constructor";}
        Base()=default;
        virtual ~Base(){}
    };

    class Derived:public Base{
    public:
        Derived(double arg){
            std::cout<<"\nDerived constructor";
        }
        using Base::Base;//This is the key for the answer

    };


    int main(){

        Base* derivedPtr1 {new Derived{0.2}};//calls derived ctor
        Base* derivedPtr2 {new Derived{2}};//calls base ctor
        delete derivedPtr2;
        delete derivedPtr1;

    }

Другой код, в котором нет ctor по умолчанию

#include<iostream>

class Base{

public:
    Base(int arg){std::cout<<"\nBase constructor";}
    virtual ~Base(){}

};

class Derived:public Base{
int k{};
public:
    Derived(double arg):Base(2){
        std::cout<<"\nDerived constructor";
    }
    using Base::Base;
    Derived()=default;
    ~Derived(){std::cout<<"\nDerived destructor";}

};


int main(){

    Base* derivedPtr1 {new Derived{0.2}};
    Base* derivedPtr2 {new Derived{2}};
    delete derivedPtr2;
    delete derivedPtr1;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...