2012-03-13 3 views
2

Есть ли способ, которым я могу сделать следующую работу, или есть работа вокруг? Я должен что-то упустить.C++ полиморфизм - доступ к производным функциям с базовым указателем

class base 
{ 
public: 
    int someInt; 
    virtual void someFunction(){} 
}; 

class derived : public base 
{ 
public: 
    void someFunction(){} 
    void anotherFunction(){} 
}; 

int main (int argc, char * const argv[]) { 

    base* aBasePointer = new derived; 

    aBasePointer->anotherFunction(); 

    delete aBasePointer 

    return 0; 
} 
+1

Вам нужно 'anotherFunction()' также быть виртуальным в базе. Или назовите его указателем на производный. На данный момент база ничего не знает об этой функции. – BoBTFish

+0

Что такое * реальные * функции? почему ты хочешь сделать это? –

+0

Он должен быть виртуальным и определен в базе. Это не поможет, если вы добавите новую виртуальную функцию в Derived. –

ответ

7

dynamic_cast<> Используйте для опущенных указателя производного класса (не забудьте проверить результат).

например

if ((derived* p = dynamic_cast<derived*>(aBasePointer))) 
{ 
    // p is of type derived. 
    p->anotherFunction(); 
} 
+1

Удивительный, только то, что я был после. –

2

Что Nim предложил будет работать, но если вы выполняете downcasts вы почти наверняка есть проблемы проектирования. Если вы объясните, что вы пытаетесь достичь, возможно, мы можем предложить лучшую альтернативу.

-1

Это будет работать

int main (int argc, char * const argv[]) { 

    derived* aDerivedPointer = new derived; 

    aDerivedPointer->anotherFunction(); 

    delete aDerivedPointer 

    return 0; 
} 

Кроме того, вы должны предоставить больше информации о том, что вы пытаетесь достичь.