C ++ Абстрактный тип инициализации - PullRequest
0 голосов
/ 17 января 2011

У меня есть класс 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 ]

4 голосов
/ 17 января 2011

Вы используете абстрактные классы в качестве указателя и ссылок, поэтому вы должны сделать

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
0 голосов
/ 17 января 2011

Вам нужно работать с интерфейсом * здесь.

...