Мне нужно создать специализированный объект, который использует конструктор базового класса. Это произойдет в методе шаблона, поэтому сконструированный объект будет одним из созданных мной специализированных классов.
Допустим, у нас есть классы: Base, Child1, Child2, Child3.
template <class T>
std::shared_ptr<T> createObject(...) {
...
return std::make_shared<T>(arg X, arg Y);
}
Я хочу, чтобы этот метод возвращал объект классов Child1
, Child2
или Child3
. Поэтому я использую конструктор класса Base
Base(arg X, arg Y)
.
Проблема в том, что если у меня есть член объекта в одном из этих классов, он может не инициализироваться при построении с использованием базового класса. .
Пример:
struct A{
A() = default;
int a{1};
int b{2};
};
struct B:public A{
B(int val):c{val}{};
using A::A;
int c{3};
};
int main(){
auto b_obj = std::make_shared<B>();
return b_obj->c;
}
При использовании MSV C конструкция b_obj
не инициализировала член объекта int c
.
Следовательно, чтобы избежать это подверженное ошибкам поведение, мне было интересно, есть ли способ запретить объявление члена объекта, например, в унаследованных классах.
Или, если есть другой подход к тому, что мне нужно, чтобы избежать ошибок.