【问题标题】:Inherit from two parent class (which inherit from one base class) but some methods don't work从两个父类继承(从一个基类继承),但有些方法不起作用
【发布时间】:2020-04-29 03:09:52
【问题描述】:

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

最少的代码:

#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 最后,但它不会那样工作。 我将特别感谢您的详细回复。

【问题讨论】:

  • 您在寻找什么“详细回复”?您是否不了解结果,或者您了解结果,但正在询问如何实现不同的行为,如果是这样,您究竟在寻找什么行为?你需要详细解释你到底在问什么,这很难说。
  • 正如我所写,我希望 val = 3 最后但它等于 1,尽管使用了 C 类的函数测试。
  • 哦,我不知道这样的事情,所以我该如何连接它们或者有什么其他方法可以解决这个问题?
  • 你为什么在这里使用链接:return A::get();valprotected 成员,因此您的派生类继承它,因此您可以直接使用。

标签: c++ class multiple-inheritance


【解决方案1】:

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

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

当您调用D::get()(它调用B::get())时,您检查BA 对象的值。


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

【讨论】:

  • 我会尝试这个,但我想使用其他东西(目前我对虚拟构造函数和其他东西不太了解),无论如何感谢您的回复。
猜你喜欢
  • 2010-09-23
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 2021-09-12
相关资源
最近更新 更多