реклама на сайте
подробности

 
 
> Иерархия классов, непонятное поведение IAR
Непомнящий Евген...
сообщение Aug 9 2007, 07:57
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



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 байт.
Странно как-то...

Сообщение отредактировал Непомнящий Евгений - Aug 9 2007, 07:58
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
alexander55
сообщение Aug 9 2007, 09:43
Сообщение #2


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



[Удалил лишнее цитирование]

Я использую более старый IAR 4.10B, так там вообще множественного наследования не было. Думаю пора перейти на что-нибудь поновее.
А теперь Вопрос . Вы объявили
struct IInterf
,а почему не как класс ?

Сообщение отредактировал IgorKossak - Aug 13 2007, 07:28
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 9 2007, 12:27
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(alexander55 @ Aug 9 2007, 13:43) *
struct IInterf
,а почему не как класс ?


Да в принципе это совершенно все равно, единственное различие - в struct по умолчанию модиификаторы доступа public, а в class - private.
Так что для "интерфейсов" (соответствующего ключевого слова в С++ нету) я обычно использую struct.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Aug 9 2007, 13:18
Сообщение #4


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



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

1.А вы попробуйте, такие встречаются фичи, что сразу и не догадаться.
2. Попробуйте наследовать не больше одного класса. Это слегка кривовато, но если будет работать...
P.S. Главное в освоении очередного компилятора - узнать его фичи (глюки).
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Aug 10 2007, 08:43
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



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


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

Виртуальный_метод
Таблица_виртуальных_методов
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 13 2007, 05:55
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



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


Я знаю, что такое __vptr smile.gif.
Меня удивляет, зачем он нужен в классе, в котором нет новых виртуальных функций и почему его наличие зависит от порядка наследования ...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 11:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016