У меня два класса, у каждого из них по несколько детей:
class ContainerGeneral {...};
class ContainerTypeA : ContainerGeneral {
public:
void doSomethingA();
};
class ContainerTypeB : ContainerGeneral {
void doSomethingB();
};
class InterpreterGeneral {
protected:
ContainerGeneral* container;
};
class InterpreterTypeA : InterpreterGeneral {
public:
void saveContainer(ContainerTypeA* cont) {
container = cont;
}
};
class InterpreterTypeB : InterpreterGeneral {
public:
void saveContainer(ContainerTypeB* cont) {
container = cont;
}
};
Классы Interpreter
используются для контейнера соответствующего типа (A
до A
, B
до B
, General
до General
). Для этого я добавил к InterpreterGeneral
указатель члена на объект ContainerGeneral
. Я хочу, чтобы InterpreterGeneral
обратился к этому объекту как ContainerGeneral
, но я хочу, чтобы унаследованные классы могли обращаться к тому же контейнеру, что и контейнер соответствующего типа. Я могу сделать это, приведя указатель к унаследованному классу при обращении к нему (примеры только для A
для экономии места):
(ContainerTypeA*)container->doSomethingA();
Или добавив новый указатель члена унаследованного типа, который будет указывать на то же место, что и контейнер:
class InterpreterTypeA : InterpreterGeneral {
public:
void saveContainer(ContainerTypeA* cont) {
containerA = cont;
container = cont;
}
void doSomething() {
containerA->doSomethingA();
}
private:
ContainerTypeA* containerA;
};
Какова лучшая практика в этом случае, и есть ли способ сделать это настолько чистым, насколько это возможно, без разыгрывания каждый раз и без добавления новых членов, которые не содержат никакой «новой» информации?