Я не знаю что вы хотите получить, поэтому не могу ответить на вопрос что надо. Приватность тут думаю не поможет
Просто надо сделать так чтобы конструктор у Д принимал как аргумент один базовый класса для всех остальных
вероятно, вам надо просто не определять т.е. struct C { C() { cout << "C()\n"; } }; struct D : public C{ D(const C& c) : own(c) { cout << "D(c)\n"; } private: const C& own; }; и тогда такое: C c; D d1(c); D d2(d1); будет работать
Так сработает, но, из-за конструктора который сгенерирует компилятор
хм. Можно явно скастить к нужному типу, тогда работает https://godbolt.org/z/T3va8zPd7
Да, но хотелось бы чтобы ООП это, само сделало. Я видимо где-то допускаю синтаксическую ошибку
Оно само и делает. Просто, как уже заметили, если явно не определить - отработает неявный вариант, если определить и удалить - из перечня перегрузок конструктор не уйдет, а он более подходящий, чем с uppercast'ом. Еще, кстати, вот такой вариант - D(const D& d) : D(static_cast<C>(d)) { }
Ну раз его удалил значит его уже нет для компилятора. Но почему тогда он не апкаститься чтобы выбрать другой подходящий конструктор из остальных
Ну раз его удалил значит его уже нет для компилятора :)
Я вам выше написал, почитайте за перегрузку функций
Обсуждают сегодня