Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Признаться, не знаю. Скорее всего да. Потому, что C-шный... 30.07.05 00:14 Число просмотров: 1433
Автор: amirul@home Статус: Незарегистрированный пользователь
|
> >>>.... Пустые классы > > запрещены. > > Кем? Это стандарт языка?
Признаться, не знаю. Скорее всего да. Потому, что C-шный компилятор замечательно грызет пустые структуры и выдает sizeof == 0.
> Не совсем точно. Не обязательно виртуальной. Класс уже не > пуст, если присутствует любая функция.
Я неточно выразился. Вообще то я имел в виду память под объектом класса. Обычная функция член не занимает памяти в объектах класса.
> Кстати класс может быть не пустым даже в том случае, если > он не содержит никаких членов (переменных или функций), а > содержит только модификаторы доступа к членам базового > класса.
См. замечание выше
> > > " .... Only the non-virtual > > data members occupy space in > > > each instance. " > > > (Visual C and C++ (General) Technical Articles. > C++: > > Under > > > the Hood) > > Как раз здесь ошибка. Поскольку фунция - тоже мембер.
Но не data member.
> > Я так понимаю, виртуальные члены-данные это члены > классов, > > отнаследованные виртуально. Члены-данные виртуального
Тут очевидная ачипятка. Надо читать "члены классов, отнаследованнЫХ виртуально". Деепричастие относится к слову "классов", а не "члены". Далее по тексте понятно, что я имел в виду.
> Поясни, что ты имеешь ввиду. Виртуальное наследование >функций- это виртуальное наследование. Не виртуальное -
> наследование не виртуальных функций. О каких виртуальных >членах-данныхты говоришь?
Нет виртуальные функции и виртуальное наследование совершенно разные вещи.
class Base {
public:
int member;
};
class Derived1: virtual public Base {
};
class Derived2: virtual public Base {
};
class Test: public Derived1, public Derived2 {
public:
void test() {
if (&Derived1::member != &Derived2::member)
throw -1;
}
};
int
main() {
Test t;
try {
t.test();
} catch (int i) {
return i;
}
return 0;
};
---
Программа вернет 0
Я не знаю, что микрософтовцы имели в виду под виртуальными членами-данными, но члены-данные виртуального базового класса - единственное разумное объяснение
> > Не только она. Еще и таблица базовых классов vbase > > (используется для RTTI), если включена RTTI
> Верное и полезное уточнение. Сам впервые ее увидел при отладке под WinDbg MFC-шного кода.
|
|
|