将派生对象传递给构造函数

时间:2018-06-03 17:37:41

标签: c++ templates inheritance

我有2个基类。 第一个包含回调函数列表:

    class BaseCallbacks {
     public:
       virtual void callback1() = 0;
       virtual void callback2() = 0;

       virtual ~BaseCallbacks(){};
    };

第二课只包含一些对我未来专业课的所有版本都很常见的逻辑:

class BaseClass{
  public:
    BaseClass();

    void some_function();
};

还有一个允许我与另一个应用程序交互的外部类:

class InterfaceClass {
  public:
    InterfaceClass(int x, int y, BaseCallbacks &callbacks);
    virtual ~InterfaceClass(){};
};

我的派生类的一个特殊版本看起来像这样:

enum TYPE{TYPE1,TYPE2};

template<bool B, TYPE T>
class DerivedClass : public BaseClass, public BaseCallbacks
{
  public:
    DerivedClass(int a);

    virtual void callback1() override;
    virtual void callback2() override;
  };

以下导致编译器错误:

int main()
{
    DerivedClass<true, TYPE::TYPE1> D1(666);

    auto interface_ptr = std::make_shared<InterfaceClass>(111, 222, &D1);
}

Visual Studio编译器说:&#34;错误C2664:&#39; InterfaceClass :: InterfaceClass(InterfaceClass&amp;)&#39; :无法转换&#39; DerivedClass&#39;到&#39; BaseCallbacks&#39; &#34;

据我所知,编译器无法弄清楚DerivedClass的对象是否包含所需的回调。问题是为什么?

我怀疑模板和多重继承与它有关。你们能不能对这个问题有所了解?提前谢谢。

1 个答案:

答案 0 :(得分:0)

请注意,InterfaceClass构造函数接受对BaseCallbacks的引用:

InterfaceClass(int x, int y, BaseCallbacks &callbacks);

但是您尝试将指针传递给DerivedClass(可转换为指向BaseCallbacks的指针):

std::make_shared<InterfaceClass>(111, 222, &D1);

所以,要解决这个问题,请传递D1本身,而不是它的地址。