我在Algorithm1
文件中定义了一个抽象类.h
。我想要这个抽象类Algorithm1
来保存对其他一些抽象类的引用,并且能够在运行时确定哪些抽象类。所以我的Algorithm1
拥有这些引用,我希望能够通过构造函数传递确切的实现。 Algorithm1
的一个确切实现是类Algorithm1A
所以这就是它的外观。
Algorithm1.h
#include "Interval.h"
#include "OrderedAlphabet.hpp"
#include "Rank.h"
//! Algorithm1 interface
class Algorithm1 {
protected:
Rank &rank;
OrderedAlphabet &alphabet;
std::map<symbol_type, occurence_type> &C;
public:
Algorithm1(Rank &r,
OrderedAlphabet &a,
std::map<symbol_type, occurence_type> &c):
rank(r), alphabet(a), C(c) {
}
};
#endif /* Algorithm1_h */
Algorithm1A
#include "Algorithm1.h"
class Algorithm1A : Algorithm1 {
std::string uniqueCharsInInterval(int i, int j) {
rank.rank() // dome something with ABSTRACT rank
}
std::vector<Interval> getIntervals(int i, int j) {
alphabet.getSize() // do something with alphabet - not abstract
C.find('x') // do something with C - not abstract
}
};
除此之外,我的Rank
类也是一个抽象类,但是由类WTRank
,NTRank
等实现。所以我真正想要的是能够传递WTRank
对象,但作为对Rank
的构造函数的Algorithm1
引用。
Rank.h
#ifndef Rank_h
#define Rank_h
#include "DataTypes.h"
//! Rank interface
class Rank {
public:
virtual unsigned long long rank(int index, symbol_type symbol)=0;
};
#endif /* Rank_h */
我的WTRank
课程分为.h
和.cpp
个文件。
WTRank.h
#ifndef WTRank_h
#define WTRank_h
#include "Rank.h"
#include <sdsl/wavelet_trees.hpp>
using namespace sdsl;
//! Rank based on Wavelet Tree
class WTRank: public Rank {
private:
wt_huff<> wt;
public:
WTRank(wt_huff<> w_tree) {
this->wt = w_tree;
}
~WTRank();
unsigned long long rank(int index, symbol_type symbol);
};
#endif /* WTRank_h */
WTRank.cpp
#include "WTRank.h"
unsigned long long WTRank::rank(int index, symbol_type symbol) {
return wt.rank(index, symbol);
}
现在,如果我想创建一个实现Algorithm1A
抽象类的Algorithm1
对象,并且我想给它的构造函数提供所需的参数,我正在做这样的事情 - 并得到&#34;否匹配构造函数错误。&#34;
wt_huff<> wt;
construct_im(wt, str, 1);
OrderedAlphabet alphabet(10);
std::map<symbol_type, occurence_type> C = calculateC(wt, alphabet);
WTRank wtrank = *new WTRank(wt);
Algorithm1A alg = new Algorithm1A(wtrank, &alphabet, &C); // ERROR!!
如何才能让它发挥作用?
答案 0 :(得分:2)
默认情况下,构造函数不会在C ++中继承。如果您有C ++ 11,则可以将基类构造函数显式转发到派生类:
class Algorithm1A : Algorithm1 {
public:
using Algorithm1::Algorithm1;
...
};
答案 1 :(得分:1)
构造函数不是继承的。你需要在 Algorithm1A
上定义一个构造函数,它接受适当的参数。
Algorithm1A :: Algorithm1A(Rank&amp; r,& #xA; OrderedAlphabet&amp; a,&#xA; std :: map&lt; symbol_type,occurence_type&gt;&amp; c):&#xA; Algorithm1(r,a,c)&#xA; {}&#xA;
&#xA;