C ++抽象类型初始化

时间:2011-01-16 23:27:27

标签: c++ inheritance abstract-class

我有一个类接口,它有纯虚方法。在另一个类中,我有一个嵌套类型,它继承自Interface并使其成为非抽象类。我使用Interface作为一个类型并使用该函数来初始化类型,但是我得到了,因为抽象类型而无法编译。

接口:

struct Interface
{
   virtual void something() = 0;
}

实现:

class AnotherClass
{
    struct DeriveInterface : public Interface
    {
        void something() {}
    }

    Interface interface() const
    {
        DeriveInterface i;
        return i;
    }
}

用法:

struct Usage : public AnotherClass
{
    void called()
    {
        Interface i = interface(); //causes error
    }
}

2 个答案:

答案 0 :(得分:4)

你使用抽象类作为指针和引用,所以你要做

class AnotherClass
{
    struct DeriveInterface : public Interface
    {
        void something() {}
    }

    DeriveInterface m_intf;

    Interface &interface() const
    {
        return m_intf;
    }
}

struct Usage : public AnotherClass
{
    void called()
    {
        Interface &i = interface();
    }
}

加上几个分号,它会正常工作。请注意,只有指针和引用在C ++中是多态的,所以即使Interface不是抽象的,代码也会因为所谓的切片而不正确。

struct Base { virtual int f(); }
struct Der: public Base { 
   int f(); // override
};

...
Der d;
Base b=d; // this object will only have B's behaviour, b.f() would not call Der::f

答案 1 :(得分:0)

您需要在此处使用Interface *。