Вопрос:
Я хочу осуществить Foo() в буквенных классах А, В, С. Если мне нужно сделать, чтобы объявить foo
? (Virtual Pure?)
Ответ:
Этот вопрос нужно задать в обратном направлении. В каком базовом классе имеет смысл создать интерфейс foo
. Давайте рассмотрим некоторые классы, которые вы можете найти в приложении.
struct Shape {};
struct Rectangle : public Shape {};
struct Square : public Rectangle {};
struct Ellipse : public Shape {};
struct Circle : public Ellipse {};
Это имеет смысл, что все Shape
быть в состоянии вернуть их площадь и периметр. Таким образом, вы помещаете их как функции virtual
в Shape
.
struct Shape
{
virtual double area() const = 0;
virtual double perimeter() const = 0;
};
Перед тем, как можно создать экземпляр подтипа Shape
, вы должны реализовать их.
Если вы хотите создать Rectangle
, эти функции должны быть реализованы в Rectangle
, так как других промежуточных классов нет.
Если вы хотите создать Square
, эти функции должны быть выполнены либо в Rectangle
, Square
, либо в обоих случаях.
Аналогичным образом, если вы хотите создать Ellipse
, эти функции должны быть реализованы в Ellipse
, так как других промежуточных классов нет.
Если вы хотите создать Circle
, эти функции должны быть реализованы либо в Ellipse
, Circle
, либо в обоих случаях.
Однако, только Rectangle
s имеют длину и ширину. Только Ellipse
s имеют большой радиус и малый радиус. Не имеет смысла добавлять виртуальные функции-члены в Shape
, чтобы вернуть эти значения.
Вопрос:
Нужно ли я (тривиальные) реализации в средних слоях среднего и higher_up?
Ответ:
Нет, вы не знаете. Ответ на предыдущий вопрос должен уточнить, что больше.
Если это чистый виртуальный, вы должны реализовать его в каждом не абстрактном классе, который происходит от 'rock_bottom'. В противном случае вы не должны. – Aleph
Вы должны реализовать ту же подпись (виртуальный необязательно). – amchacon
@Aleph: Не каждый класс. Только те, которые вы хотите быть не абстрактными (или базовыми классами тех, прямых или косвенных). –