C++ 如何用一个具体类实例化一个抽象类?

C++ 如何用一个具体类实例化一个抽象类?,c++,templates,inheritance,polymorphism,wrapper,C++,Templates,Inheritance,Polymorphism,Wrapper,我想知道下一段的意思是什么,我如何执行它。我昨天问了一个与同一问题有关的问题。在昨天的问题中,我被告知这是不可能的,但我认为下面的一段表明这是可能的 您的方法使用特定的求幂方法。但是,求幂类是一般类的子类 抽象求幂类。您可以实现这些来使用这个抽象类,然后用一个具体的类来实例化它。这将使您能够灵活地试验和/或更改所使用的求幂算法,例如,如果有人在未来发现更好的算法 本质上,我有一系列的求幂技术,它们的组织方式如下- template <class T> class Exponentia

我想知道下一段的意思是什么,我如何执行它。我昨天问了一个与同一问题有关的问题。在昨天的问题中,我被告知这是不可能的,但我认为下面的一段表明这是可能的

您的方法使用特定的求幂方法。但是,求幂类是一般类的子类 抽象求幂类。您可以实现这些来使用这个抽象类,然后用一个具体的类来实例化它。这将使您能够灵活地试验和/或更改所使用的求幂算法,例如,如果有人在未来发现更好的算法

本质上,我有一系列的求幂技术,它们的组织方式如下-

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()
中使用基类,然后在
main()
中用一个具体类
ExpA
ExpB
实例化基类


一个人如何着手做这件事?读了昨天的答案后,我的一个想法是使用某种包装,但我很难想象它

我看不出你到底想达到什么目的。但第一个问题是,您需要运行时多态性还是编译时多态性。看看你的代码,我猜是后者

因此,对于这个答案,我假设您有模板化的求幂类,并且您最终编写了compelx计算程序,这些程序将准确地知道它们是在
ExpA
还是
ExpB
上工作

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

template <class T, template <class U> class Exp>
void performExp(Exp<T>& obj)
{
     obj.power();
}
模板
作废性能XP(Exp&obj)
{
obj.power();
}
然后可以为该模板提供专业化或部分专业化:

template <class T>
void performExp(ExpB<T>& obj)
{
     obj.func1();
     obj.func2(); 
     obj.power();
}
模板
无效性能XP(ExpB和obj)
{
obj.func1();
obj.func2();
obj.power();
}
然后,当您在代码中使用这些模板时,编译器将推断参数并使用可能存在的任何专门化:

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

    ExpB<long> b; 
    performExp(b);       //specialized form will be used
}
intmain(){
ExpA a;
性能xp(a);
出口b;
performExp(b);//将使用专用形式
}

您可以在此

中测试结果,只需将指向基类的指针或引用(取决于具体情况)传递给您的函数。查找“多态性”。您引用的段落有点模糊,但我认为使用可能满足您的需要。@Slava我尝试了您的建议,但它不允许我调用
func1
func2
。我收到的错误是在求幂运算中没有名为“func1”的成员@Mojo-Jojo所有要调用的方法都必须在基类中定义,可能是虚拟的,也可能是纯虚拟的。另一种选择是使用
dynamic\u cast
,但这通常是设计糟糕的标志。
int main() {
    ExpA<long> a;
    performExp(a);

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