从两个父 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。不过,在您了解多重继承的工作原理之前,这不是您想要搞砸的事情。
我在继承后遇到了一些方法的问题。 很难(对我来说)说出问题到底出在哪里,但我会尝试通过示例来说明这一点。
最小代码:
#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。不过,在您了解多重继承的工作原理之前,这不是您想要搞砸的事情。