Причина, по которой вы получаете эту ошибку, заключается в том, что второе определение iTest::foo
и cTest::foo
не имеет одинаковую подпись и, следовательно, ctest
не реализует iTest::foo
.
с полными именами.ваши объявления выглядят следующим образом:
class iTest
{
public:
enum eLevel
{
Info,
};
virtual void foo( iTest::eLevel l ) = 0;
};
class cTest : public iTest
{
public:
enum eLevel
{
Info,
};
virtual void foo( cTest::eLevel l )
{
}
};
Как можно видеть, foo(iTest::eLevel)
- это не то же самое, что foo(cTest::eLevel)
, поэтому cTest
все еще является абстрактным классом и не может быть создан в качестве экземпляра.
Вы можете полностью удалить cTest::eLevel
или объявить cTest::foo
как
class cTest : public iTest
{
public:
enum eLevel
{
Info,
};
virtual void foo( iTest::eLevel l )
{
}
};