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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> прикол ), кто знает в чём фишка? ) 
:(
    Опции темы
tanderbold
Дата 16.8.2007, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет всем
пишу код:
Код

class Base{
  virtual foo(int x=0){
    cout<<x<<endl;
  }
};
class Derived{
  virtual foo(int x=1){
  cout<<x<<endl;
  }
};

void main(void){

  Derived *pD = new Derived();
  pD->foo();
  Base *pB=pD;
  pB->foo();
}


в таком виде прога выдаёт
1
0
если модифицировать функцию foo() наследника, например так
Код

class Derived{
  virtual foo(int x=1){
  cout<<x<<" наследник"<<endl;
  }
};


то прога выдаёт
1 наследник
0 наследник !!!!

)))
PM MAIL   Вверх
Lazin
Дата 16.8.2007, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



На строчках 15 и 17, компилятор разве не сказал что не хорошо пытаться вызвать private метод класса.
PM MAIL Skype GTalk   Вверх
Fazil6
Дата 16.8.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



вопревых это даже не скомпилируется ибо наследование не указано, а вообще параметры поумолчанию подставляются компиллятором на стадии компиляции исходя из типа и поэтому все правильно и никакого прикола тут нет

Добавлено через 3 минуты и 24 секунды
ПРИМЕР
PM MAIL   Вверх
tanderbold
Дата 16.8.2007, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Fazil6, это был просто каркас ) 
полный код
Код

  #include <iostream.h>
#include <conio.h>
class base{
public:
  virtual void foo(int x=0){
    cout<<x<<endl;
  }
};

class delivered: public base{
  public:
  virtual void foo(int x=1){
    cout<<x<<" derived"<<endl;
  }
};

void main(void){
  delivered *pD;
  pD=new delivered();
  pD->foo();
  base *pB = pD;
  pB->foo();
}


почему во втором случае выводит во второй строке
0 derived?!
такой функции даже нет!
Получается что функция наследника вызывается с параметром 0?
PM MAIL   Вверх
Fazil6
Дата 16.8.2007, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(tanderbold @  16.8.2007,  10:59 Найти цитируемый пост)
Получается что функция наследника вызывается с параметром 0?

конечно. Я так и сказал. Какой еще параметр поумолчанию может передать компилятор в эту функцию потвоему? pB имеет тип base и в этом классе foo имеет параметр поумолчанию 0. Его и подставляет. Другое значение ему взять неоткуда. Он ведь не знает какая именно функция будет вызываться вовремя работы.
PM MAIL   Вверх
bsa
Дата 16.8.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



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


Эксперт
***


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

Репутация: 11
Всего: 50



Если у тебя, например, два класса  : базовый и производный и в сигнатуре функциий двух этих классов есть аргументы по умолчанию, то аргумент по умолчанию берется из функции, основываясь на статическом типе, а не динамическом - то есть подсунул указатель на базовый класс и берется аргумент из функции базового класса.
Блин, не знаю, по-моему не совсем правильно я сформулировал - поправьте.


--------------------
user posted image  
PM MAIL   Вверх
tanderbold
Дата 17.8.2007, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Fazil6, в базовом классе в функции после вывода аргумента не выводится никакой строки!!!
Аргумент по умолчанию берётся из базового класса, а тело функции из производного!!!
Цитата

pB имеет тип base и в этом классе foo имеет параметр поумолчанию 0

а почему тогда тело функции производного класса?



PM MAIL   Вверх
MAKCim
Дата 17.8.2007, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



tanderbold, 
дефолтные параметры выводятся исходя из статического типа объекта
т. е в первом случае этот тип delivered, поэтому в метод передается 1
во-втором тип base, поэтому передается 0
в обоих случаях вызывается foo() из delivered, потому как полиморфизм


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Fazil6
Дата 17.8.2007, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(tanderbold @  17.8.2007,  07:48 Найти цитируемый пост)
Аргумент по умолчанию берётся из базового класса, а тело функции из производного!!!

все это понимают и ни у кого кроме тебя это удивления не вызывает. Почему так происходит тебе уже несколько раз объяснили разными словами, но ты похоже объяснений не читал...
PM MAIL   Вверх
MAKCim
Дата 17.8.2007, 09:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207




M
MAKCim
Модератор: Название темы должно отражать ее суть!



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
tanderbold
Дата 17.8.2007, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



MAKCim, спасибо, как раз это и хотел услышать )
PM MAIL   Вверх
Xenon
Дата 17.8.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 50



Во, MAKCim лаконичнее толкнул мысль smile


--------------------
user posted image  
PM MAIL   Вверх
Любитель
Дата 20.8.2007, 02:33 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(MAKCim @  17.8.2007,  09:34 Найти цитируемый пост)
Модератор: Название темы должно отражать ее суть!


Цитата(tanderbold @  17.8.2007,  09:39 Найти цитируемый пост)
MAKCim, спасибо, как раз это и хотел услышать )

 smile 


--------------------
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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