Я прочитал статью Херба Саттера http://www.gotw.ca/publications/mill18.htm о виртуальных функциях и о том, как они должны быть объявлены закрытыми по умолчанию. Создание виртуальной функции publi c сделает ее интерфейсом и настройщиком, и предлагается отделить интерфейс от поведения настройки, как предлагается в статье.
class shape
{
protected:
void set_area(double area)
{
area = area;
};
private:
double area;
virtual void compute_area() = 0;
};
class square
{
private:
double length;
void compute_area()
{
set_area(length*length);
}
};
Если мы рассмотрим эти классы, мы увидим, что мы никогда не сможем вызвать функцию области извне любого класса, потому что они сделаны виртуальными, поскольку мы не хотим, чтобы виртуальная функция выполняла функцию интерфейс между классом и «внешним миром», как предположил Саттер. Если я правильно понимаю его, чтобы использовать метод шаблона, и если я хочу вычислить область для объекта shape
, мне нужно предоставить публикуемую c не виртуальную функцию для класса shape
. Так что-то вроде этого?
class shape
{
public:
void interfacer()
{
compute_area();
}
protected:
void set_area(double area)
{
area = area;
};
private:
double area;
virtual void compute_area() = 0;
}
Разве это не кажется излишним по сравнению с возможностью просто сделать:
shape *ptr = new square();
ptr->compute_area();
, если бы мы сделали виртуальную функцию доступной c?
Я перечитал статью, и он сказал, что виртуальные публикации c должны использоваться "Редко, если когда-либо". Интересно, подумает ли он, что приведенное выше - один из тех случаев, когда было бы целесообразно сделать виртуальную функцию опубликованной c вместо закрытой.