Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Иерархия классов
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Непомнящий Евгений
IAR 4.20 + atmega128

Есть иерархия классов
Код
class TNonVirtual // нет виртуальных функций
{
    int a, b;
public:
    void f1(int c) {a = c;}
    void f2(int c) {b = c;}
};

struct IInterf // только чисто виртуальные ф-ции
{
    virtual void vf1() = 0;
};

class TUnion : public TNonVirtual, public IInterf
{
// нет данных или методов, нужен чтобы не переделывать имеющийся код
};

class TRes : public TUnion
{
    int abc;
public:
    void vf1() {abc = 6; }
};

TRes global;

Размер global - 10 байт. Смотрю в AVR studio:
Код
global
  TUnion
     TNonVirtual
        a
        b
     IInterf
        __vptr
  abc
  __vptr

Вопрос: А зачем нужна TRes::__vptr, если внутри TRes нет своих виртуальных ф-ций, а только реализации ф-ций IInterf?

Причем если переписать так:
class TUnion : public IInterf, public TNonVirtual - т.е. поставить сначала наследование от интерфейса, а потом - от класса без виртуальных ф-ций, то TRes::__vptr исчезает и размер global становится 8 байт.
Странно как-то...
alexander55
[Удалил лишнее цитирование]

Я использую более старый IAR 4.10B, так там вообще множественного наследования не было. Думаю пора перейти на что-нибудь поновее.
А теперь Вопрос . Вы объявили
struct IInterf
,а почему не как класс ?
Непомнящий Евгений
Цитата(alexander55 @ Aug 9 2007, 13:43) *
struct IInterf
,а почему не как класс ?


Да в принципе это совершенно все равно, единственное различие - в struct по умолчанию модиификаторы доступа public, а в class - private.
Так что для "интерфейсов" (соответствующего ключевого слова в С++ нету) я обычно использую struct.
alexander55
Цитата(Непомнящий Евгений @ Aug 9 2007, 16:27) *
Да в принципе это совершенно все равно, единственное различие - в struct по умолчанию модиификаторы доступа public, а в class - private.
Так что для "интерфейсов" (соответствующего ключевого слова в С++ нету) я обычно использую struct.

1.А вы попробуйте, такие встречаются фичи, что сразу и не догадаться.
2. Попробуйте наследовать не больше одного класса. Это слегка кривовато, но если будет работать...
P.S. Главное в освоении очередного компилятора - узнать его фичи (глюки).
_Sam_
Цитата
Вопрос: А зачем нужна TRes::__vptr, если внутри TRes нет своих виртуальных ф-ций, а только реализации ф-ций IInterf?


__vptr - это указатель на таблицу виртуальных методов. Нужен он, чтобы в зависимости от контекста
вызова vf1() подставлять соотв. реализацию этого метода.

Виртуальный_метод
Таблица_виртуальных_методов
Непомнящий Евгений
Цитата(_Sam_ @ Aug 10 2007, 12:43) *
__vptr - это указатель на таблицу виртуальных методов. Нужен он, чтобы в зависимости от контекста
вызова vf1() подставлять соотв. реализацию этого метода.


Я знаю, что такое __vptr smile.gif.
Меня удивляет, зачем он нужен в классе, в котором нет новых виртуальных функций и почему его наличие зависит от порядка наследования ...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.