Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2008, 11:37   #21
Scratch
Пользователь
 
Аватар для Scratch
 
Регистрация: 25.09.2008
Сообщений: 40
По умолчанию

Цитата:
Сообщение от filosof_x86 Посмотреть сообщение
Из подобного описания мне непонятны отношения между переменными в этих классах. Описать переменные в двух классах можно многими способами. Лучше приведи код для этих двух классов, а также код операций, понимание которых затруднено.

P.S. отмечу, что размер указателя не зависит от типа.
Вот код:
Код:
class A{
public:
   virtual void func(){cout << "Class A" << endl;}
};

class B : public A {
public:

    virtual void func(){cout << "Class B" << endl;}
};
class C : public B {
public:

    void func(){cout << "Class C" << endl;}
};

void main(){
A *cls = new C;
cls->func();
}
1)Тут немного не понятно A *cls = new C; если cls имеет тип А, но ссылается на тип C, то кем его считает компилятор типом А или С? Или он принимает какой-то особенный тип?
2) Я так понимаю new C будет содержать в себе и методы класса B тоже?
3)Из наблюдений заметил, что если функция виртуальная, то под нее выделяется дополнительно 4 байта памяти, зачем?
4)В нашем случае (A *cls = new C; ) как определить какой из методов выполнит компилятор? По идее он должен выполнить метод того класса, тип которого предписан указателю *cls(В нашем случае это А), но так ка функция виртуальна он идет вверх по древу наследия и... дальше не понимаю.
Scratch вне форума Ответить с цитированием
Старый 01.10.2008, 16:21   #22
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

1) C++ язык статической типизации, т.е. тип должен быть задан на момент компиляции и он не может изменится. Поэтому указатель cls будет иметь по-прежнему тип A.

2) Благодаря наследованию, класс C будет содержать в себе члены класса B, который в свою очередь содержит члены из класса A.

3) Есть множество моментов, влияющих на размер класса (структуры). Но вам, как новичку будет сложно понять все это сейчас, а нам объяснить вам. Для этого нужно твердо представлять, что происходит на более низком уровне. Тем более что для реализации большинства задач начального уровня эти знания не потребуются.

4) Т.к. функция-член func() объявлена как виртуальная, то при cls->func() будет найдена последняя реализация функции-члена func() в иерархии наследования от класса A (A * cls до класса C (new C; ), и в итоге будет вызвана C::func().
filosof_x86 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ссылка в паскале vitekbest Помощь студентам 3 13.06.2008 17:50
Однаразовая ссылка Stanislav PHP 5 07.03.2008 22:03
Ссылка из программы. Kukkk Общие вопросы Delphi 1 21.09.2007 22:57
Ссылка в Label amid1804 Компоненты Delphi 3 20.05.2007 17:27