Re[13]: Вызов виртуального метода для класса
От: elcste  
Дата: 22.10.04 02:22
Оценка: +1
Здравствуйте, 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. Учите язык.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.