Как мы вызываем конструктор базового класса из производного класса, используя делегирующие конструкторы
Я знаю, и я прочитал много потоков, чтобы вызвать конструктор базового класса из производного класса, но я хотел реализовать его с помощью конструкторов делегирования
Вот мой код
Ошибка указывает
«Делегирующий конструктор не может иметь других мем-инициализаторов»
#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}
.