请查看以下代码(代码值千言万语):
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
场景中)我需要做些什么才能获得多态性?
Obs:假设性能不是问题。
谢谢。
答案 0 :(得分:1)
这是个好主意。作为参考,这是由Coplien提供的字母/信封用语。
[您可以使用enum
代替;显然需要处理错误等
并行是基类型是公共的并且实现隐藏。见下文。
我只是将最初的ShapeImpl
声明公开;这会导致什么问题?