将虚拟类引用作为参数传递给构造函数

时间:2016-01-08 18:37:26

标签: c++ constructor polymorphism header-files

我在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类也是一个抽象类,但是由类WTRankNTRank等实现。所以我真正想要的是能够传递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!!

如何才能让它发挥作用?

2 个答案:

答案 0 :(得分:2)

默认情况下,构造函数不会在C ++中继承。如果您有C ++ 11,则可以将基类构造函数显式转发到派生类:

class Algorithm1A : Algorithm1 {
public:
  using Algorithm1::Algorithm1;
  ...
};

答案 1 :(得分:1)

构造函数不是继承的。你需要在 Algorithm1A 上定义一个构造函数,它接受适当的参数。

&#xA;&#xA;
  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;