Есть ли способ запретить объявление членов объекта в унаследованных классах? - PullRequest
0 голосов
/ 10 июля 2020

Мне нужно создать специализированный объект, который использует конструктор базового класса. Это произойдет в методе шаблона, поэтому сконструированный объект будет одним из созданных мной специализированных классов.

Допустим, у нас есть классы: 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.

Следовательно, чтобы избежать это подверженное ошибкам поведение, мне было интересно, есть ли способ запретить объявление члена объекта, например, в унаследованных классах.

Или, если есть другой подход к тому, что мне нужно, чтобы избежать ошибок.

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