2012-03-03 5 views
-3

У меня есть 2 класса: одна базовая и одна производная. Также есть структура.проблема с виртуальными функциями

struct D; 

class A { 
    public: 
    virtual D Multiply(D one, D two) { 
     //realization 
     return result; 
    } 
    virtual D Pow(D one, D two) { 
     result = this->Multiply(one,two); //#1 
     return result; 
    } 
}; 

class B: public virtual A { 
    public: 
    virtual D Multiply (D one, D two){ 
      //realization 
    } 
}; 

Функция Multiplyимеют реализацию в class A. Итак, этот код хорош?

B* b = new B(); 
    b->Pow(one,two); // #2 

и которые функционируют A::Multiply или B::Multiply будет вызывается в #2? Я думаю, что this на #1 укажет на A-часть B-объекта.

+1

Что произошло, когда вы пробовали ? –

+0

Наверное, ничего не произошло, потому что Multiply является частным. – ipc

+0

извините, все функции общедоступны, я пропустил это – gaussblurinc

ответ

3

Он будет называть B :: Multiply, это основные принципы OO.

+0

ОК, я знаю OO, но вы можете попробовать этот код и не быть таким педантичным. – gaussblurinc

1

это не обеспечивает B :: Multiply реализации, так что вы получите ошибку компиляции (неразрешенный внешний) если вы пишете реализацию в классе B компилятор будет вызывать B :: Multiply

+0

Я уже тестировал это приложение, и это то, что я получил Ошибка \t ошибка LNK2001: неразрешенный внешний символ «virtual int __thiscall B :: Multiply (int, int)» (? Multiply @ B @@ EAEHHH @ Z) –

+0

вопрос разрешен – gaussblurinc

+0

Извините, я не заметил, что вопрос был отредактирован. Ваш ответ был верным, когда вопрос не дал определения 'B :: Multiply'. Я сделал тривиальное изменение в вашем ответе, чтобы иметь возможность вернуть мой downvote. – hvd

Смежные вопросы