2015-05-12 2 views
0

Давайте представим ситуацию, когда у меня есть абстрактный класс с именем «Base» с виртуальным чистым методом с именем foo() и 2 дочерними (Inherited1 и Inherited2), которые оба реализуют этот метод по-своему. Теперь предположим, что одному из этих детей (Inherited1) нужен другой метод, называемый bar(), который не имеет смысла реализовывать в Inherited2.Есть ли способ передать абстрактный объект его ребенку?

В моем основных, я

Base * randomObject = new Inherited1(); 

Я не могу получить доступ к этому методу с использованием

random->bar(); 

Что я должен делать. Как я уже сказал, было бы бессмысленно реализовывать его в inherited2, поэтому я не могу просто добавить другой виртуальный метод в Base, или я должен?

+0

'Base randomObject = new Inherited1();' ---, который почти наверняка не компилируется. Вы пишете C++ или Java? – Brian

+0

извините забыл добавить указатель – asdfasdf

+0

@Brian Он все равно не сможет назвать дочернюю функцию в Inherited1 таким образом – tier1

ответ

2

Если у вас переменная

Base* randomObject = new Inherited1(); 

Вы можете бросить его вниз на базовый класс

Inherited1* foo = static_cast<Inherited1*>(randomObject); 
foo->bar(); 

Но вы должны быть уверены в том, что указатель на самом деле из этого производного класса в противном случае static_cast небезопасен. Существует несколько способов сделать это, например, сохранить enum в производных классах, которые вы можете проверить с помощью getter virtual, или проверить, является ли результат dynamic_castnullptr, но это медленнее.

+0

Спасибо, это было то, что я искал, это плохая практика делать одноразовый вызов? : static_cast (randomObject) -> bar(); Я знаю, что в моей архитектуре должна быть проблема с дизайном, но когда 10 методов используются обоими дочерними классами, за исключением одного случайного метода, я чувствовал, что мне еще нужно использовать полиморфизм. – asdfasdf

+0

Нет, это будет работать нормально, просто убедитесь, что что бросок безопасен. – CoryKramer