c++ - 使用抽象返回类型设计继承

标签 c++ templates design-patterns inheritance abstract-class

这是我想要实现的目标的粗略图像(它不会编译,所以将其视为伪代码)。请注意,尽管该示例基于公钥加密方案,但问题是关于设计模式、模板和继承的。

class CryptoProvider
{
public:
    template <typename T>
    virtual T Encrypt ()
    {
        T data;

        return data;
    }
};

class Paillier : public CryptoProvider
{
public:
    typedef int Ciphertext;

    Ciphertext Encrypt ()
    {
        Ciphertext data;
        return data;
    }
};

class ElGamal : public CryptoProvider
{
public:
    struct Ciphertext
    {
    public:
        int c1;
        int c2;
    };

    Ciphertext Encrypt ()
    {
        Ciphertext data;
        return data;
    }
};

基本上,我想在 CryptoProvider 中提供一些通用功能,如果需要,派生类可以覆盖这些功能,否则我会得到很多重复代码。如果 Encrypt 只是需要创建一个变量并调用另一个函数,那么我不想在每个派生类中都写这段代码,但是,如果派生类需要对数据做一些额外的处理,它应该能够覆盖基本方法。

我遇到的最大限制是以某种方式能够通过指定完全不同的返回类型来覆盖 Encrypt 函数。有人可以指出我如何实现这一目标的正确方向吗?我应该坚持传统的继承还是应该尝试使用 CRTP 进行编译时/静态多态性?我不知道从哪里开始。

我还想强加派生类来实现某些方法,但我不确定如何实现,如果第一个问题的解决方案要求我放弃标准继承(并且我不会从虚方法中受益)...

最佳答案

您所有的子类都将 Ciphertext 类型定义为不同的东西。这建议将其作为 CryptoProvider 的模板参数。

template <typename T>
class CryptoProvider
{
public:
    virtual T Encrypt () { ... }
    typedef T Ciphertext;
};

class PaillierBase : public CryptoProvider<int> { ... }

恕我直言,这里不需要 CRTP。

关于c++ - 使用抽象返回类型设计继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11543182/

相关文章:

c++ - 如何将 MATLAB 的 mex 设置定向到用于 C++ 编译的 Microsoft Windows SDK? (位置设置错误)

c++ - Qt模板DLL "function marked as dllimport"

C++ 模板 : correct way to return a new type

c++ - 我坚持使用 C++ 中的模板类

oop - 在 OOP 中设计食品配料类

ios - 开发 Swift iOS 应用程序 "The Right Way"

c++ - 使用动态分配创建数组并将元素插入其中

c++ - 为什么 union 不能用于继承?

c++ - CUDA:错误 LNK2005:DllMain 已在 MSVCRT.lib 中定义

java - 在循环体周围使用 try/catch block 抽象循环