class A
{
public:
virtual void fun() = 0; //"pure" virtual function
virtual void gun() = 0; //"pure" virtual function
virtual void sun() //virtual function - "not pure"
{
/***** implementation code *****/
}
};
Здесь A
- абстрактный класс, поскольку он имеет две чисто виртуальные функции.
class B : public A
{
public:
virtual void fun()
{
/******* implementation code ********/
}
};
Вопрос: Что такое B
?Это не абстрактно?В конце концов, он определил / реализовал одну виртуальную функцию pure с именем fun()
?
Ответ: Нет. B
тоже является абстрактным классом, потому что онне определил / не реализовал gun()
, что тоже является pure виртуальной функцией в базовом классе A
.Определение только одной виртуальной функции pure с именем fun()
не делает ее неабстрактной.Он должен определять ВСЕ чистые виртуальные функции.ALL означает ВСЕ, столько, сколько существует pure виртуальных функций.
Итак, два важных замечания: 1) чисто виртуальные функции, 2) определяют их все. Только тогда класс может стать конкретным / неабстрактным!