Я написал следующий фрагмент кода, чтобы проверить мое понимание виртуального наследования. По-видимому, я все еще не понимаю это полностью. Вот мой код (с последующим мой вопрос):Виртуальная функция, вызывающая не виртуальную функцию
#include <iostream>
#include <vector>
using namespace std;
class Foo
{
public:
virtual void foo();
void foo2();
};
void Foo::foo()
{
cout << "In FOO - foo 1" << endl;
foo2();
}
void Foo::foo2()
{
cout << "In FOO - foo 2" << endl;
}
class Bar : public Foo
{
public:
void foo();
void foo2();
};
void Bar::foo()
{
cout << "In BAR - foo 1" << endl;
foo2();
}
void Bar::foo2()
{
cout << "In BAR - foo 2" << endl;
}
int main()
{
Foo* f = new Foo;
f->foo();
Foo* b = new Bar;
b->foo();
return 0;
}
Это мое понимание:
указатель F указывает на базовый класс Foo и f->foo()
вызовы foo()
в базовом классе, который в свою очередь вызывает foo2()
в базовый класс.
Указатель b является указателем базового класса, но указывает на объект класса производного класса. Теперь, поскольку foo()
является виртуальной функцией, он вызывает foo()
производного класса. Теперь foo()
(производного класса) вызывает foo2()
. Поскольку foo2()
не является виртуальной функцией, я ожидал получить базовый класс foo2()
. Однако я вижу, что foo2()
производного класса вызывается.
Итак, я ожидал, что этот вывод:
In FOO - foo 1
In FOO - foo 2
In BAR - foo 1
In FOO - foo 2
но получил вместо этого:
In FOO - foo 1
In FOO - foo 2
In BAR - foo 1
In BAR - foo 2
Почему это так? Из того, что я понимаю, vtable будет иметь запись только для foo()
, а не для foo2()
. Итак, как получается вызванный foo2()
производный класс?
Это мой первый пост. Пожалуйста, извините меня, если я нарушил правила публикации. Заранее спасибо!
Добавьте вызов 'b-> foo2()' чуть ниже 'b-> foo();', посмотрите, что произойдет. Это то, чего вы ожидаете? – Useless
Да. Это то, чего я ожидаю. Благодаря ответам я теперь понимаю, что происходит :) – Vinay
Примечание: ваш код не имеет * виртуального наследования *. Он имеет обычное однонамерное наследование из полиморфного класса. Виртуальное наследование - это класс X: public virtual Y {}; ' – ybungalobill