Пожалуйста, обратите внимание на следующий код (код стоит тысячи слов):C++ Pimpl и абстрактный класс вместе
shape.hpp
class Shape {
public:
double area() const;
private:
class ShapeImpl;
ShapeImpl* pimpl;
};
shape.cc
// ABS
class Shape::ShapeImpl {
public:
double area() const = 0;
};
class Circle : public Shape::ShapeImpl { // error: Shape::ShapeImpl is private
public:
double area() const {return pi*r*r;}
};
double Shape::area() const {
return pimpl->area();
}
Я знаю, откуда исходит ошибка, но я касаются передовой практики. Мои вопросы:
В случае вышеуказанного кода смешивается Pimpl с ABC плохая идея?
Если нет, то какой способ избежать ошибки (сохранение инкапсуляции и т. Д.)?
если да, то что мне нужно сделать, чтобы получить полиморфизм, скрывая реализацию от пользователя (в моем сценарии
Shape
)?
Обс: Предположим, что производительность не является проблемой.
спасибо.
Очень поучительный пример, спасибо. Я бы тоже сделал публикацию ShapeImpl, но, поскольку я новичок в идиоме Pimpl, я не был уверен в том, чтобы изменить то, что я видел в примерах. Может быть, я слишком беспокоюсь о лучших практиках ... – montefuscolo