Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Виртуальная функция 
V
    Опции темы
oshilan
Дата 11.10.2011, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 21.3.2010

Репутация: нет
Всего: 0



Дан базовый класс A и производный от него класс A_1. В A_1 есть дополнительное поле int x, которое не может использоваться через указатель на базовый класс. Так получается виртуальные функции могут быть реализованы только с классами, у которых одинаковые поля (методы)? Так зачем они тогда такие нужны, если производные классы всегда имеют дополнительные другие поля? Внизу есть пояснительный текст программы с ошибкой (VS C++ 2008). Просьба его подкорректировать, чтобы всё работало, как того хочет пользователь, тоесть я ))
Код
#include<stdio.h>
class A
{
public:
    virtual void Out(){printf("A:\na=%d\n\n",a);}
    int a; //=1
};
class A_1 : public A
{
public:
    void Out(){printf("A_1:\na=%d\nx=%d\n\n",a,x);}
    int x; //=3
};
void main()
{
    A *p = new A;
    p->a=1;
    p->Out();

    p = new A_1;
    p->a=2;
    //p->x=3; //error C2039: x: не является членом "A"
    p->Out();
}

PM MAIL   Вверх
mes
Дата 11.10.2011, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(oshilan @  11.10.2011,  15:13 Найти цитируемый пост)
 есть дополнительное поле int x, которое не может использоваться через указатель на базовый класс. Так получается виртуальные функции могут быть реализованы только с классами, 

как раз виртуальные функции и могут (скрыто для базового интерфейса ) общаться со всеми полями наследника, в котором они определены.. 
думаю стоит еще раз внимательно обратиться к соответсвующим главам книжки..




--------------------
PM MAIL WWW   Вверх
oshilan
Дата 11.10.2011, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 21.3.2010

Репутация: нет
Всего: 0



mes, спасибо за инфу... Только вот если бы ещё где-нибудь узнать, как к ним обратиться ))

Добавлено через 6 минут и 55 секунд
Вроде нашёл: http://www.amse.ru/courses/cpp2/2010_12_06.html Если получится, исправлю листинг

Добавлено через 11 минут и 27 секунд
Не, что-то не могу )) Понял, что нужно обращаться через смещение this, но вот только как это сделать для меня загадка :)
PM MAIL   Вверх
mes
Дата 11.10.2011, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(oshilan @  11.10.2011,  15:21 Найти цитируемый пост)
как к ним обратиться

к полям наследника ? только внутри функций наследника либо при явном приведении, но это уже из другой темы.. 



--------------------
PM MAIL WWW   Вверх
oshilan
Дата 11.10.2011, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 21.3.2010

Репутация: нет
Всего: 0



mes, кстати, я даже не заметил, что всё работает правильно ))) Просто у меня в лабораторке вызывается снова функция предка. Буду разбираться. Спасибо ))
PM MAIL   Вверх
newbee
Дата 11.10.2011, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 3
Всего: 19



базовый:
int a;
virtual int stuff(){return a;}

наследник:
int b;
virtual int stuff(){return a+b;}


--------------------
You're face to face
With man who sold the world
PM   Вверх
oshilan
Дата 11.10.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 21.3.2010

Репутация: нет
Всего: 0



newbee, спасибо, я тебя понял ))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0706 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.