考虑下面的代码(我知道您可能会认为这是一个奇怪的设计。我对建设性的建议持开放态度):
class Graphics
{
// ...
public:
template <typename Type, typename... Types>
void draw(Type const& object, Types const&... objects)
{
// ...
addToBatch(object, objects...);
// ...
}
protected:
void addToBatch(Type const& object, Types const&... objects)
{
_addToBatch(object);
if constexpr (sizeof...(objects) > 0)
addToBatch(objects...);
}
void _addToBatch(Rect rc, Brush b);
void _addToBatch(std::pair<Rect, Brush> rcAndBrush)
{
_addToBatch(rcAndBrush.first, rcAndBrush.second);
}
void _addToBatch(TextLayout const& tl, Brush b, Point origin);
// ... etc
}
class SpecializedGraphics : public Graphics
{
// ...
protected:
// here I want to implement methods for specialized complex processing,
// which will use _addToBatch methods from base class
void _addToBatch(Entry const& e);
void _addToBatch(Menu const& menu);
// etc
}
int main()
{
Rect rcClient;
Brush brush;
Entry e;
Menu menu;
// etc
SpecializedGraphics gfx;
gfx.draw(
std::make_pair(rcClient, brush),
e,
menu,
// etc
)
return 0;
}
这段代码给了我一个编译器错误。我想这是因为Graphics::draw是基类方法,无法访问派生类的方法。我怎样才能正确地解决这个问题?我想到的一个解决方案是简单地将draw方法的定义从基类复制/粘贴到派生类(隐藏名称)。有什么更好的建议吗?因为为什么我需要定义已经定义的内容。
发布于 2020-04-19 18:50:49
您可以使用uso纯虚函数,在基类中将您希望保留实现的方法的声明更改为派生类,如下所示:
virtual void _addToBatch(Rect rc, Brush b) = 0;
通过这样做,该方法现在被声明为纯虚拟的,
在您的专门化类中,您现在必须定义这些函数:
class SpecializedGraphics : public Graphics
{
protected:
void _addToBatch(Rect rc, Brush b);
https://stackoverflow.com/questions/61302845
复制相似问题