簡體   English   中英

C ++將繼承的類自動轉換為基類

[英]c++ autoconvert inherited class to base class

我有一類轉換為基類的問題。 這是代碼:

    #define Derive_NTag_CRTP(Type) class Type: public NTagBase<Type>

template<typename Derived>
class NTagBase{
public:
    NTagBase(var name) { this->_name = name; }
    NTagBase(const NTagBase & ntag) { this->_name = ntag._name; }
    NTagBase* append(NTagBase<Derived> *item) { _children.push_back(item); return this; }
private:
    var _name;
    vector<NTagBase *> _children;
};

Derive_NTag_CRTP(NTag){
public:
    NTag(var name) : NTagBase(name) { }
    NTag(const NTagBase & ntag) : NTagBase(ntag) {  }
};

Derive_NTag_CRTP(NTagInput){
public:
    NTagInput(var type) : NTagBase("input") { _type = type; } 
    NTagInput(const NTagBase & ntag) : NTagBase(ntag) {  }
private:
    var _type;
};


int main(int argc, char **argv, char **envv)
{

    NTag div("div");
    NTagInput button("button");
    div.append(new NTag("span"));

    div.append(&button);// Error    1   error C2664: 'NTagBase<Derived>::append': can not convert parameter 1 from 'NTagInput *' to 'NTagBase<Derived> *'

    }

沒有一個明確的演員表,我該如何解決?

PS:我需要一個向量基類的指針,並將其附加到繼承的所有種類的類中。

divNTag ,即NTagBase<NTag> buttonNTagInput ,即NTagBase<NTagInput> ,而divappend()需要一個不相關的NTagBase<NTag> 您應該更改append到類似

template <typename D>
NTagBase* append(NTagBase<D> item) { ... }

但是,您仍然不能在單個向量中存儲不同類型的項目。 最好做一個非模板如BaseNTagBase ,讓您的載體包含指針(或std::unique_ptr )到Base

div.append (...)顯然需要重載,因為從基類繼承后,它將無法理解第二個簽名,即div.append(&button); 或者,您也可以創建一個包裝器類,將每個對象類型打包到其自己的定義中,並提供一種將其轉換回原始類型的機制。

另外,只要重載任何必要的功能即可。

class NTagInput;
class AppendInputRegister;


template<typename Derived>
class NTagBase{
    public:
        NTagBase(string name) { this->_name = name; }
        NTagBase(const NTagBase & ntag) { this->_name = ntag._name; }
        NTagBase* append(NTagBase<Derived>  *item) {
             _children.push_back((NTagBase *)item);
              return this;
        }
    private:
        string _name;
        vector<NTagBase *> _children;
};

class NTag: public NTagBase<NTag>{
    public:
        NTag(string name) : NTagBase(name) { }
        NTag(const NTagBase & ntag) : NTagBase(ntag) {  }

        NTagBase* append(NTagBase<NTagInput>  *item) {
             append((NTagBase<NTag> *)item);
        }

        NTagBase* append(NTagBase<NTag>  *item) {
             NTagBase::append((NTagBase<NTag> *)item);
        }

};

class NTagInput: public NTagBase<NTagInput>{
    public:
        NTagInput(string type) : NTagBase("input") { _type = type; }
        NTagInput(const NTagBase & ntag) : NTagBase(ntag) {  }
    private:
        string _type;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM