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

How to instantiate an abstract class with one of the concrete classes?

本文关键字:实例化 抽象类 一个 何使用      更新时间:2023-10-16

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

您的方法使用特定的幂法。但是,幂类是一般的子类 抽象幂类。您可以实现这些来使用此抽象类,并使用其中一个具体类对其进行实例化。 这将使您能够灵活地试验和/或更改所使用的幂算法,例如,如果将来有人发现了更好的算法......

从本质上讲,我有一堆幂技术,按以下方式组织-

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()中使用基类,然后使用ExpAExpB的具体类之一main()实例化基类。

如何做到这一点?阅读昨天的答案后,我的一个想法是使用某种包装器,但我很难想象它。

我不明白你想实现什么。 但第一个问题是你需要运行时还是编译时多态性。看看你的代码,我想是后者。

因此,对于这个答案,我将假设您有模板化的幂类,并且您最终编写了强制计算程序,该程序将确切地知道它们是否适用于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
}

您可以在此在线演示中测试结果