c++ - 从基类方法或其他建议访问派生类方法
问题描述
考虑下面的代码(我知道你可能认为这是一个奇怪的设计。我愿意接受建设性的建议):
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方法的定义从基类复制/粘贴到派生类(名称隐藏)。有更好的建议吗?因为为什么我需要定义已经定义的内容。
解决方案
您可以使用纯虚函数,在您的基类中更改您想要将实现保留为派生类的方法声明,如下所示:
virtual void _addToBatch(Rect rc, Brush b) = 0;
通过这样做,该方法现在被声明为纯虚拟,
现在,在您的 Specialized 类中,您必须定义这些函数:
class SpecializedGraphics : public Graphics
{
protected:
void _addToBatch(Rect rc, Brush b);
推荐阅读
- sql - 使用 CASE 为 SQLite 中的 COUNT 语句设置条件
- c# - 覆盖 ASP .NET/EFCore 3.0 中未调用的 SaveChanges()
- sql - 检查表中是否存在作为参数给出的 oracle 函数值
- css - React 应用程序 - 避免样式被其他 CSS 覆盖
- node.js - 如何等到所有嵌套函数都执行完
- excel - 跨多个工作表查找公式
- python - django.core.exceptions.ValidationError: ["'_auth_user_id' value must be an integer."] Django 错误
- vim - Unexpected SPACE character while in : 在 Neovim 中按减号键 (-) 时探索
- javascript - 如何在 NodeJs 项目中添加构建脚本和测试
- javascript - Javascript Promise 未按预期工作