Здравствуйте, erithion aka tyomik, Вы писали:
EAT>>>Забыл упомянуть, что вызов невиртуальных методов всегда происходит непосредственно, по адресу, за исключением сложных случаев наследования, когда невиртуальный метод таки попадает в виртуальную таблицу и вызывается косвенно.
EAT>class a
EAT>{
EAT>public:
EAT> a()
EAT> {
EAT> printf("a::constructor");
EAT> }
EAT> virtual void fn()
EAT> {
EAT> printf("a::fn");
EAT> }
EAT>};
EAT>class c: public virtual a
EAT>{
EAT>public:
EAT> c()
EAT> {
EAT> printf("c::constructor");
EAT> }
EAT> void fn()
EAT> {
EAT> printf("c::fn");
EAT> }
EAT>};
c::fn — виртуальная функция.
EAT>P.S.: Спасибо за вопрос. Это заинтересовало меня, поскольку в VS 2003 .NET сишный компилер генерит несколько иной код. В частности меня заинтересовал единственный параметр в конструкторе класса с равный 1. В конструкторе же можно видеть, что ежели этот параметр равен нулю, то вызова конструктора базового класса не произойдет. Пока я не знаю к какой опере это относится и как можно добится того, чтоб конструктор предка не вызывался вовсе. Кроме того, при обычном наследовании(невиртуальном) у конструктора отсутствует этот параметр вообще. Так что это повод провести более полный анализ.
Виртуальные базовые классы инициализируются только из конструктора most derived class.
P.S. Учите язык.