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
}