【发布时间】: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();?val是protected成员,因此您的派生类继承它,因此您可以直接使用。
标签: c++ class multiple-inheritance