Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > прикол )


Автор: tanderbold 16.8.2007, 10:39
Привет всем
пишу код:
Код

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 наследник !!!!

)))

Автор: Lazin 16.8.2007, 10:49
На строчках 15 и 17, компилятор разве не сказал что не хорошо пытаться вызвать private метод класса.

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

Добавлено через 3 минуты и 24 секунды
http://forum.vingrad.ru/forum/topic-163679.html

Автор: tanderbold 16.8.2007, 10:59
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?

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

конечно. Я так и сказал. Какой еще параметр поумолчанию может передать компилятор в эту функцию потвоему? pB имеет тип base и в этом классе foo имеет параметр поумолчанию 0. Его и подставляет. Другое значение ему взять неоткуда. Он ведь не знает какая именно функция будет вызываться вовремя работы.

Автор: bsa 16.8.2007, 11:06
tanderbold, http://forum.vingrad.ru/index.php?showtopic=163679&view=findpost&p=1197337

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

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

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

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



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

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

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

Автор: MAKCim 17.8.2007, 09:34

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

Автор: tanderbold 17.8.2007, 09:39
MAKCim, спасибо, как раз это и хотел услышать )

Автор: Xenon 17.8.2007, 16:42
Во, MAKCim лаконичнее толкнул мысль smile

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


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

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)