наследование — приведение C ++ и typeid

Я получил функцию, которая имеет два указателя базового класса и в зависимости от подкласса, другие функции должны быть вызваны …

Как это:

    void function(A* a, A* a2){

if (typeid(*a).name() == "B"){
if(typeid(*a2).name() == "C"){
otherFunction();
}
if(typeid(*a2).name() == "D"){
otherFunction2();
}
}
}

Однако есть целая куча проблем:

1) Я прочитал, что typeid.name дает разные результаты в зависимости от компилятора, и поэтому я не хочу его использовать.

2) Я подумал о создании экземпляра «B» и вместо этого писать if(typeid(*a2) == typeid(instanceOfB)) но это было бы много работы, так как есть много аргументов конструктора …

3) Я также рассмотрел использование dynamic_cast, но некоторые подклассы выглядят так:

  A <-- B <-- C

поэтому, если бы я хотел проверить, является ли аргумент B динамическим приведением, он прошел бы, даже если аргумент фактически является C, потому что C наследуется от B

Изменить: Кажется, мне придется пересмотреть дизайн, но так как многие заявили, что дизайн имеет недостатки, я быстро объясню, что мой ход мысли:

Там есть окно. Несколько разных объектов расположены внутри окна и перемещаются, игра. Эта функция должна была выполнять функцию обнаружения столкновений. Как это:
Просмотрите все объекты на экране, проверьте, не столкнулись ли они. Возьмите два столкнувшихся объекта в качестве аргумента и вызовите эту функцию.
Эта функция просматривает различные коллизии, такие как «если a -« стрелка », а a2 -« бандит », тогда делайте что-нибудь, но если вместо a2 -« дерево », сделайте это вместо этого!

0

Решение

Не было бы лучше иметь некоторые виртуальные методы в A которые по умолчанию ничего не делают и перезаписываются некоторыми наследующими классами?

class A {
public:
virtual void method(A *a2) {
}

virtual void otherMethod() {
}
};

class B : public A {
public:
virtual void method(A *a2) {
a2->otherMethod();
}
};

class C : public B {
public:
virtual void otherMethod() {
// do your C stuff here
}
};

class D : public A {
public:
virtual void otherMethod() {
// do your D stuff here
}
};

Достигнет ли это того, что вы пытаетесь сделать?

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]