继承层次结构中接口与实现的分离(C++ 新手)

2024-05-13

我正在想办法如何安排一些课程。这就是我到目前为止所得到的......

继承层次结构的顶层(自然)是 T:

(T.h)
namespace foo
{
    class T
    {
    public:
        virtual void method1(std::string a_parameter) = 0;
        virtual void method2() = 0;
    };
}

我有两个带有一些附加方法的 T 子类 - 这里是 头文件:

(A.h)
namespace foo
{
    class A : public T
    {
    public:
        virtual ~A() {};
        virtual void method3() = 0;
        //and a factory function
        static A* gimmeAnAyy();
    };
}

(B.h)
namespace foo
{
    class B : public T
    {
    public:
        virtual ~B() {};
        virtual void method4() = 0;
        //and a factory function
        static B* gimmeABee();
    };
}

实现类位于各自的 .cpp 文件中:

(A.cpp)
namespace foo
{
    class AImpl : public A
    {
    public:
        A(std::string member_data) : m_member_data(member_data) {};
        ~A() {};
        void method3()
        {
            //something really important, can't think of it right now ;-)
        };
    private:
        std::string m_member_data;
    };
    A* A::gimmeAnAyy()
    {
        return new AImpl("this is an impl of A");
    }; 
}

(B.cpp)
namespace foo
{
    class BImpl : public B
    {
    public:
        B(std::string other_data) : m_other_data(other_data) {};
        ~B() {};
        void method4()
        {
            //something really important, can't think of it right now ;-)
        };
    private:
        std::string m_other_data;
    };
    B* B::gimmeABee()
    {
        return new BImpl("this is an imll of B");
    }; 
}

现在编译器抱怨——这是正确的——关于虚拟函数 我还没有在AImpl和BImpl中实现method1()和method2()。

我想要的是一个AImpl和BImpl都可以继承的TImpl类 这样我就不必在两个不同的 .cpp 文件中实现 method1() 和 method2() 。

是否可以?我出去吃午饭了吗?我是否在 StackExchange 帖子中问了太多反问句?

提前致谢,

Mike


是的,这是可能的。常见的做法是使用以下代码片段:

template<typename Interface>
class TImpl : public Interface
{
public:
    virtual void method1(std::string a_parameter) { /* implementation */ }
    virtual void method2() { /* implementation */ }
};

然后继承它,如下所示:

class Aimpl : public TImpl<A>
{
public:
    virtual void method3() { /* implementation */ }
};

class Bimpl : public Timpl<B>
{
public:
    virtual void method4() { /* implementation */ }
};

您可以将 Timpl 的实现放入 cpp 文件中,但随后您必须为每个可能的接口显式实例化它。在 cpp 中按如下方式完成此操作:

template<typename Interface>
void Timpl<Interface>::method1(std::string a_parameter)
{
    /* implementation */
}

template<typename Interface>
void Timpl<Interface>::method2()
{
    /* implementation */
}

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

继承层次结构中接口与实现的分离(C++ 新手) 的相关文章

  • -ffast-math 可以安全地用于典型项目吗?

    在回答我建议的问题时 ffast math 有评论指出这是危险的 我个人的感觉是 在科学计算之外 是可以的 我还假设严肃的金融应用程序使用定点而不是浮点 当然 如果你想在你的项目中使用它 最终的答案是在你的项目上测试它 看看它有多大影响 但
  • 全局变量不好

    好吧 读完这篇文章和一些示例后 我仍然不清楚全局变量的含义 那么你的类中的私有变量是全局的吗 http www c2 com cgi wiki GlobalVariablesAreBad http www c2 com cgi wiki G
  • std::map find 在 C++ 中不起作用[重复]

    这个问题在这里已经有答案了 我使用以下几行创建了一个哈希映射和一个迭代器 std map
  • 处理器关联组 C#

    我使用的是 72 核的 Windows Server 2016 我看到有两组处理器 我的 net 应用程序将使用一个或其他组 我需要能够强制我的应用程序使用我选择的组 我看到下面的代码示例 但我无法使其工作 我可能传递了错误的变量 我希望应
  • 没有配置身份验证处理程序来处理该方案

    这是一个非常烦人的问题 我在我的 asp net core 项目上设置 cookie 身份验证 有时会出现此错误 有时不会 没有图案 它只是开始抛出错误 然后突然停止 然后再次开始 例外情况是 InvalidOperationExcepti
  • R 包与 Rcpp 的链接错误:“未定义符号:LAPACKE_dgels”

    我正在创建一个 R 包 lapacker 以使用 R API 头文件 R ext Lapack h 为 R 提供和使用的内部 LAPACK 库 仅具有双精度和双复数 提供 C 接口 源代码 https github com ypan1988
  • 为什么 xcode IDE 认为 `friend` 是保留字

    我一直在开发一个个人项目 并在我创建的新类中包含以下代码 property readonly getter isFriend BOOL friend 它似乎没有任何问题 当我构建它时 它可以编译得很好 但是当我们在xcode IDE看起来像
  • 仅使用一个 #include 表达式一次包含多个头文件?

    是否有任何表达式可以使语法一次包含多个标头 而无需为每个新文件编写 include 表达式 例如 include
  • 我应该使用字节还是int?

    我记得曾在某处读到 即使您只需要字节 使用 Int32 更好 就性能而言 它 据说 仅适用于您不关心存储的情况 这是有效的吗 例如 我需要一个保存一周中某一天的变量 我是吗 int dayOfWeek or byte dayOfWeek E
  • 将 JavaScript 引擎嵌入到 .NET 中 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 只是想知道是否有人尝试过将任何 js 引擎嵌入并实际集成到 net 环境中 我可以找到并实际使用 经过L
  • 大小为 k 的非连续子序列的最大值的最小值

    在开始之前 我希望这个问题不是重复的 我发现了几个类似的问题 但它们似乎都没有描述完全相同的问题 但如果它是重复的 我会很高兴看到一个解决方案 即使它与我的算法不同 我一直在尝试回答这个问题 https stackoverflow com
  • Qt 多重继承和信号

    由于 QObject 我在 QT 中遇到了有关多重继承的问题 我知道很多人也有同样的问题 但我不知道该如何解决 class NavigatableItem public QObject Q OBJECT signals void desel
  • 如何在C++中列出Python模块的所有函数名称?

    我有一个 C 程序 我想导入一个 Python 模块并列出该模块中的所有函数名称 我该怎么做 我使用以下代码从模块中获取字典 PyDictObject pDict PyDictObject PyModule GetDict pModule
  • 批量插入,asp.net

    我需要获取与会员相对应的 ID 号列表 在任何给定时间处理的数量可能在 10 到 10 000 之间 我可以毫无问题地收集数据 解析数据并将其加载到 DataTable 或任何内容 C 中 但我想在数据库中执行一些操作 将所有这些数据插入表
  • 为什么使用 .AsEnumerable() 而不是转换为 IEnumerable

    扩展方法之一IEnumerable
  • 结构大小与 typedef 版本不同?

    我的代码中有以下结构声明和 typedef struct blockHeaderStruct bool allocated unsigned int length typedef struct blockHeaderStruct block
  • 在 OSX 上检测 Objective C 或 C++ 中的文件夹访问(如 fs_usage 命令)

    我正在 OSX 上开发实时病毒扫描程序 OSX 的命令行命令fs usage可以通过以下方式确定文件夹访问权限 并且只能以 root 用户身份运行 fs usage w f pathname grep Users Documents Use
  • C# 中的 mshtml.HTMLDocumentClass

    在 C 中 我设法从 InternetExplorer 对象获取整个 HTMLDocumentClass 导航到某个 URL 然而 在 Visual Studio 2008 的调试模式下 该特定 URL 的 HTMLDocumentClas
  • C 中的等效 plpgsql 触发器

    我有一个 PostgreSQL 9 0 服务器 并且在某些表上使用继承 因此我必须通过如下触发器模拟外键 CREATE OR REPLACE FUNCTION othertable before update trigger RETURNS
  • 在派生类中访问基类变量

    class Program static void Main string args baseClass obj new baseClass obj intF 5 obj intS 4 child obj1 new child Consol

随机推荐

  • 在 pandas 数据框中使用 Replace 和 str.startswith() 来重命名值

    我有一个名为 源 的列 其中包含数百行文本 问题是 其中一些可以组合在一起 而我正在努力在 Pandas 数据框中做到这一点 这是我的代码 df source replace df source str startswith share n
  • 为什么 ipython 上的 if 块后续行会立即断行?

    UPDATE 这是 曾经是已知错误 https github com ipython ipython issues 11334 on v7 Runs after if block unable to use elif or else 为什么
  • 通过 ARM 模板将现有混合连接链接到 azure Web 应用程序

    我在天蓝色中有一个资源组 其中包含一个包含混合连接的中继 我正在尝试部署另一个包含 Web 应用程序的资源组 该应用程序应链接其他资源组中的现有混合连接 在天蓝色门户中执行此任务很简单 但由于我想在 ARM 模板部署期间运行 完整模式 因此
  • 解析错误:语法错误,意外的“”(T_ENCAPSED_AND_WHITESPACE)[重复]

    这个问题在这里已经有答案了 完整错误 解析错误 语法错误 意外的 T ENCAPSED AND WHITESPACE 需要标识符 T STRING 或 变量 T VARIABLE 或数字 T NUM STRING 它说错误出现在第 12 行
  • 基于回调函数对对象进行分组[重复]

    这个问题在这里已经有答案了 我有一个对象数组 需要根据给定的回调函数 排序 并放入另一个对象中 例如 var list id 102 name Alice id 205 name Bob title Dr id 592 name Clyde
  • MySQL:记录之间的平均间隔

    假设这张表 id date 1 2010 12 12 2 2010 12 13 3 2010 12 18 4 2010 12 22 5 2010 12 23 如何仅使用 MySQL 查询找到这些日期之间的平均间隔 例如 此表上的计算将是 2
  • Scikit-learn、带有洗牌组的 GroupKFold?

    我正在使用 scikit learn 中的 StratifiedKFold 但现在我还需要观察 组 有一个很好的函数 GroupKFold 但我的数据非常依赖时间 与帮助中的相似 即周数是分组索引 但每周应该只折叠一次 假设我需要折叠 10
  • Jssor 非 jquery 滑块。一页上有多个滑块[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有没有办法在一个页面上放置多个滑块 谢谢 给定一个页面中有 2 个滑块 第一个是 slider1 第二个是 slider2 div d
  • Git:结帐而不运行结帐后挂钩

    我有一个我喜欢的结帐后挂钩 大多数时候 但有时我知道运行它会浪费时间 或者 因为它会删除并重建我的开发数据库 所以我不希望它去做它的事情 有没有跳过钩子的 git 选项 公平地说 我已经开始寻找一个了 我认为没有命令行选项可以完成您想要的操
  • 我应该在 Heroku 上的哪里存储敏感文件?

    这个问题可能有一个明显的答案 只是我没有想到 我知道敏感数据 例如安全凭证 最好通过 Heroku 的 CLI 使用环境变量存储在 Heroku 等服务上heroku config add 但敏感的怎么办files 比如证书 具体来说 我想
  • 如何使用 XCode 在 iOS 应用程序中的推文中上传视频

    我是 iOS 开发新手 需要对我正在接管的 iOS 应用程序进行更改 以将视频添加到推文中 我当前的应用程序 UI 允许用户输入推文文本 但我将对其进行更改 以允许他们选择要与推文一起上传的视频 类似于 Twitter 应用程序的工作方式
  • 非二叉树的中序树遍历

    对于比二叉树更宽的树 术语 中序遍历 是否有明确定义的含义 或者 前 和 后 顺序是唯一有意义的 DFS 类型吗 我的意思是与n每个节点 gt 2 个子节点 我猜是为了n这甚至可能意味着之后要转到 根 n 2孩子们 但这曾经这样使用过吗 那
  • Typescript 通用联盟

    所以我有通用对象数组 想要迭代但打字稿不允许我 这是一些示例代码 有关如何解决此问题的任何建议 type someGeneric
  • 一起使用“过滤”和“排序”的 Google 表格

    这是我的第一个问题 我希望一切都好 我是使用谷歌表格的新手 但我正在慢慢进步 我正在尝试构建一个工作表 其中包含工作表 1 中的所有数据 在工作表 2 上 我想过滤工作表 2 中 D 列中标有数字 1 的所有数据 为此 我正在使用 FILT
  • 如何为多个 BO 属性定义 IDataErrorInfo 错误属性

    我开始通过 IDataErrorInfo 接口在我的 WPF 项目中实现验证 我的业务对象包含多个带有验证信息的属性 如何获取与该对象关联的所有错误消息的列表 我的想法是 这就是 Error 属性的用途 但我无法追踪任何使用它来报告多个属性
  • 使用UDID创建唯一的用户身份

    我正在开发一个 iPhone 应用程序 它与服务器通信以存储和交换数据 因为我想让它尽可能简单 所以我想避免用户帐户的注册 或者也可能使用密码 是否有可能 并且允许 获取 iPhone 设备的 UDID 并制作例如 它的 MD5 哈希值 我
  • 如何在不使用数据库的情况下保存应用程序的配置??? (使用简单的文本文件)

    我需要保存一个简单的字段来配置我的应用程序 因此 我不会使用数据库 它只是一个字段 我需要在文件中保存该字段的 true 或 false 值 并且每次都会有一部分我的应用程序想要检查是否属实 他们必须检查此文本文件 而不是打开与数据库的连接
  • 如何对 Firebase 中托管的静态网站进行 IP 白名单? / 是否有用于 Firebase 托管的 WAF?

    我有一个在 Firebase 中托管的静态网站 我可以很好地附加一个自定义域 我想将对我的网站的访问限制在特定范围的 IP 范围内 我知道在 GCP 中 Google Cloud Armor 可以做到这一点 但 Cloud Armor 仅适
  • 如何预览 Git 中的隐藏内容?

    我想检查一个存储 并找出如果我将其应用于当前状态的工作树 它会发生什么变化 我知道我可以对存储进行 git diff 但这向我展示了工作树和存储之间的所有差异 而我只是想知道存储应用将改变什么 git stash show将向您显示最近存储
  • 继承层次结构中接口与实现的分离(C++ 新手)

    我正在想办法如何安排一些课程 这就是我到目前为止所得到的 继承层次结构的顶层 自然 是 T T h namespace foo class T public virtual void method1 std string a paramet