请看下面的代码(一个代码值一千字):
形状.hpp
class Shape {
public:
double area() const;
private:
class ShapeImpl;
ShapeImpl* pimpl;
};
形状.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
场景中)?
Obs:假设性能不是问题。
谢谢你。