如何继承并实现以抽象类为参数的纯虚方法?

2024-03-29

我有一个抽象类Node其中包含纯虚拟方法存根matches,需要另一个实例Node(即子类化的事物的实例Node) 作为参数。

class Node; // forward declaration

class Node {
public:
    Node() : parentNode(this) {}
    virtual ~Node() {}

    Node* parentNode;

    virtual bool matches(const Node& node) const = 0;
};

我该如何实施matches在子类中,参数可以是子类类型,而不是Node?

例如。我希望将以下内容注册为合同的实施版本Node,这样我就可以访问NodeImpl特定属性作为函数的一部分,否则我将无法执行此操作:

class NodeImpl : public Node {
private:
    int foo;
    ...
};

...

bool NodeImpl::matches(const NodeImpl& n) const {
    return this->foo == n.foo;
}

(我确实尝试过使用模板来实现这种效果,但我不确定我做得是否正确。我发现自己在我的代码中传播模板并遇到了无数错误,并且希望在我浪费更多时间在可能也是错误的做事方法上之前,先了解正确的方法到底是什么。)

我尝试的是:

template <class T>
class Node;

template <class T>
class Node {
public:
    Node() : parentNode(this) {}
    virtual ~Node() {}

    Node* parentNode;

    virtual bool matches(const T& node) const = 0;
};

这样我就可以在模板函数中一般调用匹配项,如下所示:

template <class T>
void pathComp(Node<T>& currNode, Node<T>& rootNode) {
    Node<T> *node = &currNode;
    while (node->matches(rootNode)) {
        ...
    }
}

我无法完全让这种方法发挥作用,而且我不喜欢我似乎必须有的方式class NodeImpl : public Node<NodeImpl>作为我的遗产,这件事似乎不太对劲。任何关于我是否正确的建议都会很棒!


一般来说,你不能真正做到这一点,因为它不是类型安全的。例如:

struct Node { virtual bool matches(const Node &) const = 0; }
struct NodeA : Node { virtual bool matches(const NodeA &) const; };
struct NodeB : Node { virtual bool matches(const NodeB &) const; };

NodeA a; // compiler doesn't allow, but if it did...
NodeB b;
Node &c = a;
c.matches(b); // oops!

您谈论实施它​​的方式,会有一个假设b与以下类型相同a,但编译器通常无法验证该假设,因此它不会允许这样做。

但是,如果您使用相同类型的两个节点,则始终可以拥有matches()函数不是虚拟的:

struct Node {   }
struct NodeA : Node {  bool matches(const NodeA &) const; };

NodeA a1;
NodeA a2;
a1.matches(a2); // fine
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何继承并实现以抽象类为参数的纯虚方法? 的相关文章

随机推荐

  • 在 Pandas 中,如何根据列的值对多索引的一个级别进行排序,同时保持另一级别的分组

    我现在正在大学学习数据挖掘课程 但我有点陷入多索引排序问题 实际数据涉及大约 100 万条电影评论 我试图根据美国邮政编码进行分析 但为了测试如何做我想做的事 我一直在使用一个小得多的数据集 其中包含 250 个随机生成的数据集我使用的是年
  • 结构伪类和属性选择器不能一起工作

    我有这个 HTML 代码 div class field div
  • 如何在不使用 R 中的 for 循环的情况下编写此指标矩阵

    我有一个由一系列数字给出的因子向量 这些因素也可以在单独的数据集中找到 称为test set and train set 以下代码的作用是查找数据集中的因子在因子向量中匹配的位置 并将 1 放在矩阵的位置 乘以这个矩阵compound te
  • 在持续重构的项目中使用 git/mercurial?

    我试图了解我是否真的有使用 git mercurial 的情况 我工作的项目是java和c 项目 通常有5 20人致力于 一个共同的目标 发布 大多数开发人员都是专业开发人员 重构代码一直 所以典型的linux内核有大量的 单独文件中相对独
  • 有没有一种简单的方法来获取时间戳==昨天的数据?

    有没有一种简单的方法来获取时间戳 昨天的数据 我只想要昨天的数据 SELECT COUNT t0 user id AS t0 qt AC5uO9oi FROM something here AS t0 WHERE t0 event type
  • 了解“中位数的中位数”算法

    我想了解以下示例的 中位数 算法 我们有 45 个不同的数字 分为 9 组 每组 5 个元素 48 43 38 33 28 23 18 13 8 49 44 39 34 29 24 19 14 9 50 45 40 35 30 25 20
  • 如何安装uWebSockets?

    我通过 VMware 在 Windows 10 上运行 ubuntu 因为Udacity课程需要uWebSockets来运行模拟器 这是班级安装它的步骤 run chmod a x install linux sh 这是install li
  • 在 For 循环内创建线程 C++

    我一直在 for 循环内尝试多线程 基本代码块将是这样的 void function int a string b MyClass Obj MyClass2 Obj2 execution part void anotherclass Mem
  • C# 类多态

    为什么下面代码的结果是 Class AA级A级 public class A public virtual void f Console WriteLine Class A public class B A public virtual v
  • 如何保护网站免受 DoS 攻击

    保护站点免受 DoS 攻击的最佳方法是什么 知道流行的网站 服务如何处理这个问题吗 应用程序 操作系统 网络 托管级别的工具 服务是什么 如果有人能分享他们的真实经历 那就太好了 Thanks 您确定是说 DoS 不是注入吗 在 Web 编
  • Materialise css 图标不显示在 Safari 浏览器中

    我注意到materialized CSS图标不显示在Safari v5 1 7 7534 57 2 关于这个主题进行了很多搜索 但没有任何有关 safari 的浏览器兼容性的文档已列出 谁能告诉我这是否是一个需要修复的错误 或者是否有其他方
  • Python 正则表达式 findall 带变量

    我正在尝试使用 re findall 与后视和前瞻来提取数据 当我不使用 raw input 变量时 正则表达式工作正常 但我需要用户能够输入各种不同的搜索词 这是当前的代码 me re findall r lt variable vari
  • Angular Google 地图 - 自动设置“中心”和“缩放”以适应所有标记

    我的 Google 地图中有一个动态生成的标记列表 我希望地图的中心成为所有标记的中心 并缩小到足以使所有标记都在视图中 在计算地图中心方面 也许可以通过迭代所有的纬度和经度并找到中心点来实现 但是 我无法找出计算缩放比例的最佳方法 这有可
  • 异构词典,但是类型化?

    这更多的是一个学术探究而不是一个实际问题 是否有任何语言或框架功能可以或将来允许异构类型字典 例如 myDict Add Name Bill myDict Add Height 1 2 其中 myDict 现在不包含两个object类型作为
  • 错误:迁移到 androidx 后找不到符号类 MediaStyle

    android support v4 media app NotificationCompat MediaStyle 在音乐播放器应用程序中工作正常 但迁移到 android x 后出现此错误 找不到符号类 MediaStyle 任何帮助将
  • 使用 post 方法打开 URL android

    我必须向网址发送一些参数并打开它 但我不知道该怎么做 var variables URLVariables new URLVariables variables param1 param1 variables param2 param2 v
  • Objective-C 在 NSArray 中搜索字符串?

    我有一个字符串数组 我如何才能找出字符串在数组中的索引 NSArray indexOfObject http developer apple com mac library documentation Cocoa Reference Fou
  • Elixir - 递归列表值的总和

    只是尝试对列表值进行简单求和 defmodule Mth do def sum list do 0 end def sum list H T do H sum list T end end IO puts Mth sum list 1 2
  • Google App-Engine 按国家/地区阻止传入流量?

    我正在考虑通过 Google 的 App Engine for PHP 开发一个系统 我现在进展顺利 但意识到我不知道有什么好方法来拒绝来自以邪恶居民闻名的国家的传入流量 在其他站点上 我只是通过 htaccess 阻止子网 然而 我现在开
  • 如何继承并实现以抽象类为参数的纯虚方法?

    我有一个抽象类Node其中包含纯虚拟方法存根matches 需要另一个实例Node 即子类化的事物的实例Node 作为参数 class Node forward declaration class Node public Node pare