Первая чисто виртуальная функция может быть реализована!
#include <iostream>
class Animal
{
public:
void eat(void);
protected:
virtual void doEat(void)=0;
};
void Animal::eat(void)
{
doEat();
}
void Animal::doEat(void)
{
std::cout << "animal" << std::endl;
}
class Tiger : public Animal
{
private:
virtual void doEat(void)
{
Animal::doEat();//here is the difference between protected and private
std::cout << "tiger" << std::endl;
}
};
int main(void)
{
Animal *p = new Tiger();
p->eat();
return 0;
}
Во-вторых, Херб Саттер объяснил, когда использовать «виртуальный частный» или «виртуально защищенный», вы можете прочитать из этой статьи Я думаю, это объясняет, почему мы делаем это не только мы! В статье говорится: «Предпочитаю делать виртуальные функции частными, только если производные классы должны вызывать базовую реализацию виртуальной функции, делать виртуальную функцию защищенной», ваш вопросо чистой виртуальной функции, я не совсем уверен, удовлетворяю ли этот принцип.