如何使用其中一个具体类实例化一个抽象类?

问题描述 投票:1回答:1

我想知道以下段落的含义以及如何实现它。昨天我问了一个与here相同问题有关的问题。在昨天的问题中,我被告知这是不可能的,但我认为以下段落表明它是?

您的方法使用特定的取幂方法。但是,取幂类是一般抽象取幂类的子类。您可以实现这些以使用此抽象类,并使用其中一个具体类实例化它。这将使您可以灵活地试验和/或准确改变使用的取幂算法,例如,如果有人在将来识别出更好的东西......

基本上,我有一堆以下列方式组织的取幂技术 -

template <class T>
class Exponentiation
{
    public:
    Exponentiation() {};
    virtual ~Exponentiation() {};

    // computes C = A^n
    virtual void power(T& C, const T& A, const int n) = 0;
}

template <class T>
class ExpA : public Exponentiation<T>
{
    public:
    ExpA() {};
    ~ExpA() {};

    void power (T& C, const T& A, const int n);
}

template <class T>
class ExpB : public Exponentiation<T>
{
    protected:
    var1;
    var2;

    public:
    ExpB() {};
    ~ExpB() {};

    func1();
    func2();
    void power (T& C, const T& A, const int n);
}

现在,最初我有一个performExp()调用特定的取幂方法,如 -

performExp()
{
    ExpA<long> objA;
    objA.power();

    // or

    ExpB<long> objB;
    objB.func1();
    objB.func2();
    obj.power ()
}

但据我所知,更好的选择是在performExp()中使用基类,然后在main()中使用其中一个具体类ExpAExpB实例化基类。

怎么去做这个?我在阅读昨天的答案之后想到的是使用某种包装,但我很难想象它。

c++ templates inheritance polymorphism wrapper
1个回答
1
投票

我没有看到你想要实现的目标。但第一个问题是你是否需要运行时或编译时多态。看看你的代码,我想这是后者。

所以我假设你有这个答案你有模板化的指数类,并且你在最后的compelx计算程序中编写,它们将确切地知道它们是否在ExpAExpB上工作。

然后,我建议将performExp()实现为模板函数,以通用方式指示如何执行操作:

template <class T, template <class U> class Exp>
void performExp(Exp<T>& obj)
{
     obj.power();
}

然后可以为此模板提供特化或部分特化:

template <class T>
void performExp(ExpB<T>& obj)
{
     obj.func1();
     obj.func2(); 
     obj.power();
}

然后,当您在代码中使用这些模板时,编译器将推导出参数并使用可能存在的任何特化:

int main() {
    ExpA<long> a;
    performExp(a);

    ExpB<long> b; 
    performExp(b);       //specialized form will be used
}

你可以在这个online demo中测试结果

© www.soinside.com 2019 - 2024. All rights reserved.