Возможно ли ввести ограничение на наследование классов?

Есть следующая структура наследования:

class Parent;

class Child1: public Parent;
class Child2: public Parent;

class GrandChild: public Child1;

vector<Parent*> V{};

Вектор V может содержать указатели на экземпляр любого из этого классов. Но возможно ли запретить использование класса GrandChild? Т.е. вектор V мог бы содержать только Child1*, Child2* (Parent*).


Ответы (1 шт):

Автор решения: Zhihar

вам надо, чтобы компилятор ругался?

поскольку везде используется указатель и в векторе при приведении типов можно хранить хоть указатель на int, типа

val = 0;
V.push_back((Parent*)&val);

можно сделать извратно -

  1. создать специальный класс-оболочку Guard, который будет содержать ссылку на Parent

  2. вектор должен хранить именно этот класс, а не указатель

     vector<Guard> V;
    
  3. в конструкторе класса или в методе set делать проверку - какой тип передаваемого объекта и отсекать всё, что не Child1, Child2 или Parent

типа так:

Child1 obj1;
GrandChild obj2

vector<Guard> V;
V.push_back(Guard(obj1)); // сработает
V.push_back(Guard(obj2)); // не сработает, компилятор ругнется
→ Ссылка