Я написал следующий фрагмент кода, чтобы проверить мое понимание виртуального наследования. Очевидно, я все еще не понимаю это полностью. Вот мой код (за которым следует мой вопрос):
#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 является указателем базового класса, но указывает на объект производного класса Bar. Теперь, поскольку 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()
производного класса?
Это мой первый пост. Пожалуйста, извините, если я нарушил правила публикации. Заранее спасибо!