LINUX.ORG.RU

[C++]Вызов виртуальной функции предка


0

1

Всем доброго времени суток.

Вопрос вот по такому коду:

class A
{
public:
    virtual void foo();
}

class B: public A
{
public:
    virtual void foo()
    {
        /*do something*/
        A::foo();
    }
}

void foo2()
{
    A* a  = new B();
    a->foo();
}

Что-то я сутра не могу вспонить, вызовется все же функция A::foo() или будет бесконечная рекурсия B::foo().

Всем заранее спасибо за ответы.

P.S. Еще подобный вопрос, если есть в наличии класс A2, который наследуется от A, а B наследуется от A2. При этом A2::foo() не имеет реализации.

★★★★★

а проверить? Вообще, у тебя A::foo не имеет реализации, так что не скомпилируется. Если добавить реализацию, то A::foo вызовет именно A::foo

phoenix ★★★★ ()

> Что-то я сутра не могу вспонить

Что мешает проверить самому? Это заняло бы не намного больше времени, чем ушло на то, чтобы накатать этот пост.

вызовется все же функция A::foo() или будет бесконечная рекурсия B::foo().

Не вызовется, undefined reference. То же самое с A2.

rival ★★ ()

Забыл добавить реализацию A::foo(), будем считать, что она есть.
Спасибо phoenix и rival за ответы.

trex6 ★★★★★ ()

> Что-то я сутра не могу вспонить, вызовется все же функция A::foo() или будет бесконечная рекурсия B::foo().

Если указал foo из класса A, то и вызовется foo из области видимости класса A

anonymous ()

> если есть в наличии класс A2, который наследуется от A, а B наследуется от A2. При этом A2::foo() не имеет реализации.

Вызовется foo() из класса A2, который в данном случае наследуется из A, т.е. A2::foo в данном случае является A::foo().

anonymous ()
Ответ на: комментарий от Boy_from_Jungle

> Ты про RTTI почитай .....

RTTI зачем приплели сюда?

anonymous ()

Ты обращаешься к методу статически, а не как к виртуальному методу класса

namezys ★★★★ ()
Ответ на: комментарий от anonymous

> Дурень, эти куски просто для иллюстрации.

Пфф, читай весь тред. ТС сам сказал, что забыл добавить реализацию.

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

rival ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.