Может ли фиктивный класс наследовать от другого фиктивного класса в googlemock? - PullRequest
5 голосов
/ 30 марта 2011

Может ли фиктивный класс наследовать от другого фиктивного класса в 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

Ответы [ 2 ]

5 голосов
/ 30 марта 2011

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

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

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;
}

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

2 голосов
/ 30 марта 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...