Чистая виртуальная реализация C ++ и файлы заголовков - PullRequest
11 голосов
/ 13 января 2011

У меня возникают проблемы с реализацией чисто виртуальных функций, унаследованных от какого-то абстрактного класса, когда рассматриваемые классы делятся на *.h и *.cpp files. Компилятор (g++) говорит мне, что производный класс не может быть создан из-за существования чистых функций.

/** interface.h**/
namespace ns
{
    class Interface {
        public:
            virtual void method()=0;
    }
}

/** interface.cpp**/
namespace ns
{
    //Interface::method()() //not implemented here
}

/** derived.h **/
namespace ns
{
    class Derived : public Interface {
        //note - see below
    }
}

/** derived.cpp **/
namespace ns
{
    void Derived::Interface::method() { /*doSomething*/ }
}

/** main.cpp **/
using namespace ns;
int main()
{
    Interface* instance = new Derived; //compiler error
}

Значит ли это, что мне нужно объявить метод () дважды - в интерфейсе *.h и в derived.h тоже? Разве нет другого пути?

Ответы [ 2 ]

14 голосов
/ 13 января 2011

Вы забыли объявить Derived::method().

Вы пытались определить его как минимум, но написали Derived::Interface::method() вместо Derived::method(), но вы даже не пытались его объявить. Поэтому его не существует.

Следовательно, Derived не имеет method(), поэтому чисто виртуальная функция method() из Interface не была переопределена ... и, следовательно, Derived также является чисто виртуальной и не может быть создана.

Кроме того, public void method()=0; не является допустимым C ++; это больше похоже на Java. Чистые виртуальные функции-члены должны быть виртуальными, но вы не написали virtual. И спецификаторы доступа сопровождаются двоеточием:

public:
    virtual void method() = 0;
13 голосов
/ 13 января 2011

Вы должны объявить свой метод в подклассе.

// interface.hpp
class Interface {
public:
    virtual void method()=0;
}

// derived.hpp
class Derived : public Interface {
public:
    void method();
}

// derived.cpp
void
Derived::method()
{
    // do something
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...