Может ли фиктивный класс наследоваться от другого фиктивного класса в googlemock?

Может ли фиктивный класс наследоваться от другого фиктивного класса в googlemock? Если да, то, пожалуйста, помогите мне понять, почему это не работает.

class IA
{
public:
   virtual int test1(int a) = 0;
};

class IB : public IA
{
public:
   virtual float test2(float b) = 0;
};

class MockA : public IA
{
public:
   MOCK_METHOD1(test1, int (int a));
};

class MockB : public MockA, public IB
{
public:
   MOCK_METHOD1(test2, float (float b));
};

Я получаю ошибку компилятора cannot instantiate abstract class для MockB, но не для MockA


person Rishabh    schedule 30.03.2011    source источник


Ответы (2)


Если вы планируете использовать множественное наследование, вам следует использовать виртуальное наследование.

Следующий пример компилируется и нормально компилируется:

class IA
{
    public:
        virtual int test1(int a) = 0;
};

class IB : virtual public IA
{
    public:
        virtual float test2(float b) = 0;
};

class MockA :virtual public IA
{
    public:
        int test1(int a)
        {
            return a+1;
        }
};

class MockB : public MockA, public IB
{
    public:
        float test2(float b)
        {
            return b+0.1;
        }
};

int main()
{
    MockB b;
    (void)b;
}

Это всего лишь небольшая модификация вашего примера

person BЈовић    schedule 30.03.2011

Класс MockB наследуется от IB, который имеет две чисто абстрактные функции: test1 и test2. И вам нужно переопределить их обоих. Наследование от MockA, которое переопределяет test1, недостаточно (по крайней мере, в C++ - в Java это сработает). Итак, исправление состоит в том, чтобы добавить

virtual int test1(int a)
{
    return MockA::test1(a);
}

к MockB определению.

person Tadeusz Kopec    schedule 30.03.2011