2010-02-09 4 views
2

Я поймал эту проблему больше, чем один раз:Обнаружение орфографическими виртуальной функции

class A{ 
public: 
    virtual ~A() {} 
    virtual int longDescriptiveName(){ return 0; } 
}; 

class B: public A{ 
public: 
    virtual int longDescriptveName(){ return 1; } // Oops 
}; 

Если функция чисто виртуальная, компилятор ловит ошибку. Но если это не так, это может быть ужасная ошибка для отслеживания. Часть проблемы состоит в том, что имена функций могут быть слишком длинными. Но я все еще удивляюсь, есть ли способ увидеть эти ошибки раньше?

ответ

2

Одним из возможных вариантов являются малопользованной чисто виртуальной функцией с реализацией:

virtual int longDescriptiveName() = 0 
{ 
    return 0; 
} 

Это заставляет возникающих классы для переопределения. Затем они могут вызвать реализацию базового класса, если они хотят только этого поведения.

Также вам нужно убедиться, что ваша иерархия наследования является плоской, а не многослойной, что в целом хорошо, так как наследование достаточно хрупкое, без наложения на слои.

1

При компиляции с помощью Microsoft Visual C++ 2005 или новее, есть нестандартное расширение позволяет написать:

virtual int longDescriptveName() override { return 1; } 

И компилятор будет жаловаться. Если вы компилируете и другие компиляторы, возможно, умнее сделать #define, чтобы вы могли контролировать поведение.

+0

Это полезное расширение! Но я использую gcc. –

0

Старый вопрос necro'd, но один хороший способ - проверить рано или официально с помощью модульных тестов или более неофициально, прежде чем начинать использовать ваши классы. Другими словами, проверить на ранней стадии, что:

A test_a; 
B test_b; 
A& poly_a = test_a; 
A& poly_b = test_b; 
assert(poly_a.longDescriptiveName() == 0); 
assert(poly_b.longDescriptiveName() == 1); 

перед тем писать больше 10000 строк кода, которые используют классы.

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