Использует ли виртуальное наследование и виртуальная функция один и тот же vtable? - PullRequest
3 голосов
/ 26 июня 2011

Есть один маленький связанный вопрос . Но тема совсем другая.

Теперь одна концепция о разрешении функции, а другая о class разрешении? Мне интересно, как это возможно, если они используют один и тот же vtable (, по крайней мере, в gcc-4.5 )? Это зависимая от компилятора терминология?

Я знаю, что это может показаться глупым, но я никогда не думал об этом.

Ответы [ 2 ]

3 голосов
/ 26 июня 2011

Хорошей ссылкой для такого рода вещей является Itanium ABI - см., Например, http://mentorembedded.github.com/cxx-abi/abi.html#vtable. Несмотря на название, это широко используемый ABI для C ++, и он описывает хорошую, работающую реализацию (хотя, очевидно, возможны и другие реализации) .

1 голос
/ 27 июня 2011

Вы можете решить обе проблемы (вызовы виртуальных функций и виртуальное наследование), если вам известен динамический тип объекта, на который имеется только указатель на него. Каждый (полиморфный) объект в C ++ имеет ровно один динамический тип , который определяется в момент его создания. Например. когда вы пишете new Foo, этот объект имеет динамический тип Foo, даже если вы храните только void*.

A vtable - это механизм для хранения информации о динамическом типе объекта таким образом, чтобы ее можно было получить с помощью базового указателя. Вы можете хранить довольно много вещей в vtable: указатели на функции, смещения приведения, std::type_info даже объекты.

...