C ++:重叠基类方法

时间:2010-12-22 23:08:45

标签: c++ class inheritance multiple-inheritance overloading

当继承两个基类时,如果两者都有一个具有相同名称和签名的方法会发生什么?

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();
}

会发生什么?

3 个答案:

答案 0 :(得分:8)

好吧,首先,无论对Update的调用是什么,您的代码都无法编译:

  • Update成员函数缺少返回类型
  • ShapePhysicsGraphics私下继承,因此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来解决任何歧义。