6

モッククラスは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

4

2 に答える 2

7

多重継承を使用する場合は、仮想継承を使用する必要があります。

次の例はコンパイルしてうまくリンクします:

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

それはあなたの例のほんの小さな修正です

于 2011-03-30T10:56:08.617 に答える
2

と の 2 つの純粋に抽象化された関数を持つクラスMockBを継承します。そして、それらの両方をオーバーライドする必要があります。どのオーバーライドから継承するかは不十分です (少なくとも C++ では - Java では機能します)。したがって、修正は追加することです IBtest1test2MockAtest1

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

MockB定義へ。

于 2011-03-30T10:22:27.360 に答える