2013-07-05 2 views
2

У меня есть следующий класс:Вызов чистой виртуальной функции из базового класса, который ее не определяет?

class gkLogicBrick 
{ 
public: 
    gkLogicBrick(gkGameObject* object, gkLogicLink* link, const gkString& name); 
    virtual ~gkLogicBrick(); 

    virtual gkLogicBrick* clone(gkLogicLink* link, gkGameObject* dest) = 0; 

    //unimportant function/variables 
}; 

и это время подклассы, как:

class gkLogicController : public gkLogicBrick 
{ 
    gkLogicController(gkGameObject* object, gkLogicLink* link, const gkString& name); 
    virtual ~gkLogicController() {} 

    //unimportant function/variables 
}; 

Метод назван clone() не быть переопределены и все же она вызывается из другого класса на gkLogicController объекта , Я думал, что назвать чистые виртуальные функции не разрешено? Могут ли компиляторы C++ автоматически создавать определение по умолчанию для любых унаследованных виртуальных функций?

+0

Да, он компилируется. Это небольшая часть большой библиотеки. Я предполагаю, что это не позволяет, поэтому, возможно, мне стоит посмотреть дальше и посмотреть, не происходит ли что-то еще, что мне не хватает ... – mpellegr

ответ

4

Это нормально, чтобы вызвать чистую виртуальную функцию (через механизм динамической рассылки). Это на самом деле цель чистых виртуальных функций, когда вы думаете об этом.

Я предполагаю, что «вызывается из другого класса на объекте gkLogicController» на самом деле означает через указатель или ссылку ce до gkLogicController. Затем это должно указывать/ссылаться на экземпляр класса, производного от gkLogicController, который переопределяет clone. Невозможно создать экземпляр gkLogicController, так как он еще абстрактный.

+0

Возможно, это так. Функция 'clone' вызывается для каждого члена в списке объектов' gkLogicBrick', я прослеживается дальше и вижу, что в этот список добавляются объекты gkLogicController. Теперь мне просто нужно посмотреть, что вызывает эта функция, и так далее. – mpellegr

+0

После большой трассировки я, кажется, нашел класс используемых объектов, которые реализуют клон. Благодаря! – mpellegr

2

Я думаю, вы не скомпилировали свой код. Поскольку

struct A 
{ 
    virtual void test()=0; 
}; 

struct B : A 
{ 

}; 

int main() 
{ 
    B b;  
} 

http://ideone.com/Dbx9iH

увидеть ошибку:

prog.cpp: In function ‘int main()’: prog.cpp:13:7: error: cannot declare variable ‘b’ to be of abstract type ‘B’ prog.cpp:6:8: note: because the following virtual functions are pure within ‘B’: prog.cpp:3:18: note: virtual void A::test()

1

Если вы не определили функцию SOMEWHERE в реальном классе (например, производный класс), вы получите сообщение об ошибке при попытке для создания объекта (во время компиляции).

В любом случае, не стоит иметь один в базовом классе, если базовый класс никогда не создается напрямую - на самом деле его часто используют таким образом, чтобы просто убедиться, что базовое слово случайно не используется, когда оно не должно быть , Если базовый класс предназначен для использования, то вам нужно реализовать эту функцию (вы все равно можете это сделать, даже если в конце этого слова указано = 0.

И все, что нужно для виртуальных функций, - это позволить базовому классу (или другой компонент, который знает только о базовом классе), чтобы вызвать фактическую функцию в производном классе.

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