繁体   English   中英

是否有可能使指针指向由好奇递归模板创建的基类?

[英]Is it possible to have a pointer point a base class created by curiously recursive template?

是否可以在不使用接口的情况下使指针指向由好奇递归模板创建的基类?

例:

template<typename Derived>
class Base
{
public:
    Base();
    virtual ~Base();

    void EventA();
    void EventB();
    void EventC();

};

class DerivedA: public Base<DerivedA>
{
private:
    void EventA_imp();
    void EventB_imp();
    void EventC_imp();
};

class Manager
{
private:
    Base* base;
};

您不能, Base不是类型, Base<DerivedA>是类型,但是指向Base<DerivedA>的指针当然不能分配给指向Base<DerivedB>的指针。

您可以做的是从其他对象(例如BaseTypeErased )派生Base并有一个指向它的指针。 然后可以将指向DerivedA类型的对象的指针分配给BaseTypeErased*

class BaseTypeErased{
public:
    virtual ~BaseTypeErased(){};
};

template<typename Derived>
class Base : public BaseTypeErased
{
public:
    Base(){};
    virtual ~Base(){};

};

class DerivedA: public Base<DerivedA>
{
};

int main()
{
    BaseTypeErased* base = new DerivedA;
    delete base;
}

这是我的意思的一个例子。 当然,管理方法将更加麻烦,例如:

#include <iostream>

class BaseTypeErased{
public:
    void EventA(){
        EventA_imp();
    }
    virtual ~BaseTypeErased(){}
private:
    virtual void EventA_imp() = 0;
};

template<typename Derived>
class Base : public BaseTypeErased
{
public:
    Base() : derived(static_cast<Derived&>(*this)){};
    virtual ~Base(){};
private:
    void EventA_imp() override {
      derived.EventA();
    }
    Derived& derived;
};

class DerivedA: public Base<DerivedA>
{
    public:
    void EventA() {
        std::cout << "DerivedA::EventA" << std::endl;
    }
};

int main()
{
    BaseTypeErased* base = new DerivedA;
    base->EventA();
    delete base;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM