2016-12-10 5 views
0

У меня проблема с моим кодом.C++ Как вызвать дочерний метод в абстрактном родительском классе?

class A{ 
    virtual foo()=0; 
} 

class B: public A { 
    foo(); 
    foo2(); 
    operator X(A * a) {a->foo2()} //doesn't work 
} 

class C: public A { 
    foo(); 
    foo2(); 
    operator X(A * a) {a->foo2()} //doesn't work. 
} 

Таким образом, у меня есть виртуальный класс и 2 класса, которые наследуют его. И я должен определить оператор X, который действует на объект A, независимо от того, является ли он B или C (поскольку он не может быть A, поскольку A является абстрактным). Проблема в том, что оператор вызывает foo2(), который мне не разрешено писать в классе A. Что мне делать?

Большое спасибо за помощь. Это мой первый пост.

+1

Изменить сигнатуру оператора на 'X (B * a)'. –

+0

Это потому, что 'foo2()' не является частью класса A. –

+0

Я не могу изменить подпись оператора. Я предполагаю, что мой оператор X работает, независимо от того, является ли это B или C. Я вижу только это как A ... – Student000

ответ

1

Право Ответ заключается в объявлении foo2 чистого виртуального в A. Однако вам сказали, что вам не разрешено это делать. Boo :-(

Ваш единственный оставшийся вариант заключается в использовании dynamic_cast

void do_foo2(A* a) 
{ 
    if (B* b = dynamic_cast<B*>(b)) 
     return b->foo2(); 
    C& c = dynamic_cast<C&>(*a); // Will throw if a is not B or C. 
    return c.foo2(); 
} 

Тогда

void B::operator X(A* a) 
{ 
    do_foo2(a); 
} 

. Примечание: Все это предполагает, что вы должны сделать B::operator X работу как с B и C.

+0

Да, это имеет такой смысл! Спасибо, я только что провел целый день на этом :-) – Student000