Как мы вызываем конструктор базового класса из производного класса, используя делегирующие конструкторы

Я знаю, и я прочитал много потоков, чтобы вызвать конструктор базового класса из производного класса, но я хотел реализовать его с помощью конструкторов делегирования

Вот мой код

Ошибка указывает

«Делегирующий конструктор не может иметь других мем-инициализаторов»

      #include <iostream>
using namespace std;

// Shivang101
class Base
{
private:
    int value;

public:
    Base() : value{0}
    {
        cout << "Base no args constructor called" << endl;
    }
    Base(int x) : value{x}
    {
        cout << "Base (int) overloaded constructor called" << endl;
    }
    ~Base()
    {
        cout << "Base Destructor called" << endl;
    }
};
class Derived : public Base
{

private:
    int testing_value;
    int doubled_value;
    // using Base ::Base;

public:
    Derived() : Derived{0, 0}
    {
        cout << "NO arg constructor called" << endl;
    };
    // In the below line I'm Trying a call the base class constructor but getting error
    Derived(int testing_val) : Base{testing_val}, Derived{testing_val, 0}
    {
        cout << "One arg constructor called" << endl;
    }
    
    Derived(int testing_val, int doubled_val) : testing_value{testing_val}, doubled_value{doubled_val}
    {
        cout << "Delegating constructor/ overloaded called" << endl;
    }
    ~Derived()
    {
        cout << "Derived destructor called" << endl;
    }
};
int main()
{
    Derived d{1000};
    return 0;
}

Я хотел вызвать конструктор моего базового класса и инициализировать «значение» в базовом классе как «1000» и инициализировать «testing_*value» и «double_*value» в производном классе как «1000» и «2000» соответственно.

2 ответа

Я нашел решение своего вопроса

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

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

      #include <bits/stdc++.h>
using namespace std;

// Shivang101
class Base
{
private:
public:
    int value;
    int value2;
    Base() : value{0}
    {
        cout << "Base no args constructor called" << endl;
    }
    Base(int x) : value{x}
    {
        cout << "Base (int) overloaded constructor called" << endl;
    }
    ~Base()
    {
        cout << "Base Destructor called" << endl;
    }
};
class Derived : public Base
{

private:
public:
    int testing_value;
    int doubled_value;
    // using Base ::Base;

    Derived() : Derived{0, 0}
    {
        cout << "NO arg constructor called" << endl;
    };

    Derived(int testing_val) : Derived{testing_val, 0}
    {
        cout << "One arg constructor called" << endl;
    }

    Derived(int testing_val, int doubled_val) : Base{testing_val}, testing_value{testing_val}, doubled_value{doubled_val * 2}
    {
        cout << "Delegating constructor/ overloaded called" << endl;
    }
    ~Derived()
    {
        cout << "Derived destructor called" << endl;
    }
};
int main()
{
    Derived d{1000};
    cout << d.value << endl;

    return 0;
}
    ```

Конструктор отвечает за инициализацию всех членов и базовых подобъектов.

Делегирующий конструктор делегирует другому конструктору.

Не может быть и того, и другого. Либо вы делегируете полномочия в другом месте, либо инициализируете члены и базовые подобъекты.

Цитата из cppreference:

Делегирующий конструктор

Если имя самого класса отображается как класс-или-идентификатор в списке инициализаторов членов, то этот список должен состоять только из этого одного инициализатора членов; такой конструктор известен как конструктор делегирования, а конструктор, выбранный единственным членом списка инициализаторов, является целевым конструктором.

Я полагаю, вы можете переставить конструкторы для достижения желаемого эффекта. Хотя я не вижу, как это можно сделать без реализации еще одного конструктора или изменения способа делегирования, потому что в настоящее время тот, который принимает два аргумента, вызывает конструктор по умолчанию дляBase, но делегирующий ему пытается вызватьBase{testing_val}.

Другие вопросы по тегам