从两个父 class 继承(从一个基 class 继承)但有些方法不起作用

Inherit from two parent class (which inherit from one base class) but some methods don't work

我在继承后遇到了一些方法的问题。 很难(对我来说)说出问题到底出在哪里,但我会尝试通过示例来说明这一点。

最小代码:

#include <iostream>

class A
{
public:
    A() {};
    A(int x):val(x)
    {
        std::cout << "A constructor work" << std::endl;
    }

    int get()
    {
        std::cout << "Get A work" << std::endl;
        return val;
    }

protected:
    int val; 
};

class B: protected A
{
public:
    B(int x) :A(x) 
    {
        std::cout << "B constructor work" << std::endl;
        test();
    }

    int get()
    {
        std::cout << "Get B work" << std::endl;
        return A::get();
    }

protected:
    void test()
    {
        if (A::val == 0)
        {
            std::cout << "Test B work" << std::endl;
            A::val = 1;
        }
    }

};

class C : protected A
{
public:

    C() {};
    C(int x) :A(x)
    {
        std::cout << "C constructor work" << std::endl;
        test();
    }

    int get()
    {
        std::cout << "Get C work" << std::endl;
        return A::get();
    }
protected:
    void test()
    {
        std::cout << "Test C work" << std::endl;

        if (A::val != 0)
        {
            A::val += 2;
        }
    }

};

class D : private B, private C
{
public:
    D(int x):B(x)
    {
        std::cout << "D constructor work" << std::endl;
        C::test();
    }

    int get()
    {
        std::cout << "Get D work" << std::endl;
        return B::get();
    }

};


int main()
{
    D d(0);

    std::cout << d.get() << std::endl;
}


Output: 
**A constructor work
B constructor work
Test B work
D constructor work
Test C work
Test C extra work
Get D work
Get B work
Get A work
1**

我希望最终 val = 3,但它不是那样工作的。 非常感谢您的详细回复。

您的 class D 包含两个 A 对象 - 一个由 B 继承,一个由 C

继承

当您调用 C::test() 时,您更改了 C 中的 A 对象。

当您调用 D::get() 时 - 调用 B::get() - 您检查 B.

A 对象的值

解决这个问题的一种方法是 virtual inheritance。不过,在您了解多重继承的工作原理之前,这不是您想要搞砸的事情。