C ++: перекрывающиеся методы базового класса - PullRequest
0 голосов
/ 23 декабря 2010

При наследовании двух базовых классов, что произойдет, если у обоих будет метод с одинаковым именем и сигнатурой?

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 ]

8 голосов
/ 23 декабря 2010

Ну, во-первых, ваш код не компилируется независимо от вызова Update:

  • Отсутствие функций-членов Update возвращает типы
  • Shape наследуется в частном порядке от Physics и Graphics, поэтому Update недоступен с main

Теперь, как говорится, то, что происходит, когда вы пытаетесь вызвать Update, является неоднозначностью, которая приведет к ошибке компиляции. Эта двусмысленность может быть снята с помощью:

shape.Physics::Update();
shape.Graphics::Update();
1 голос
/ 23 декабря 2010

Найдено здесь 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()
0 голосов
/ 23 декабря 2010

В этом случае он должен вызвать Physics :: Update, потому что вы указали это первым, когда определили наследование. На самом деле, в этом случае он не будет работать, потому что он не виден вам, потому что вы не указали публичное наследование, но если вы это сделали, вы должны получить Physics :: Update по умолчанию. Лучшее, что вы можете сделать, - это разрешить любую неоднозначность, написав Shape :: Update и указав при необходимости Physics :: Update и / или Graphics :: Update.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...