当继承两个基类时,如果两者都有一个具有相同名称和签名的方法会发生什么?
class Physics
{
public:
void Update() { std::cout << "Physics!" }
};
class Graphics
{
public:
void Update() { std::cout << "Graphics!" }
};
class Shape : Physics, Graphics
{
};
int main()
{
Shape shape;
shape.Update();
}
会发生什么?
答案 0 :(得分:8)
好吧,首先,无论对Update
的调用是什么,您的代码都无法编译:
Update
成员函数缺少返回类型Shape
从Physics
和Graphics
私下继承,因此Update
无法访问main
现在,正如所说的那样,当你试图调用Update
时会发生什么是一种歧义,这将导致编译错误。可以使用以下方式解除这种歧义:
shape.Physics::Update();
shape.Graphics::Update();
答案 1 :(得分:1)
在此处找到https://gist.github.com/752273
$ g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:22: error: request for member ‘Update’ is ambiguous
test.cpp:12: error: candidates are: void Graphics::Update()
test.cpp:6: error: void Physics::Update()
答案 2 :(得分:-2)
在这种情况下,它应该调用Physics :: Update,因为您在定义继承时首先指定了它。实际上,在这种情况下,它不起作用,因为你没有看到它,因为你没有指定公共继承,但如果你这样做,你应该默认获得Physics :: Update。你要做的最好的事情是通过编写Shape :: Update并根据需要调用Physics :: Update和/或Graphics :: Update来解决任何歧义。