ФлеймФорумПрограммирование

Самые удивительные открытия в С/С++, которые вам доводилось делать (5 стр)

Страницы: 1 2 3 4 5
#60
13:31, 20 июня 2010

ciber_man
> -> 550 страниц
http://cm.bell-labs.com/cm/cs/who/dmr/ctut.pdf
Керниган уложился в 24 страницы крупными буквами.

#61
14:20, 20 июня 2010

Pokimon
только этот стандарт уже никем и нигде не поддерживается...

#62
14:30, 20 июня 2010

lagartos
> Не получается.

И не получится, лол, переопределяется только для потомка.

Найди отличие:

Здесь..

class A
{
public:
  A()
  {}
  virtual ~A() = 0
  {}

  virtual A *copy() = 0;
};

class B
  :  public A
{
public:
  B()
  {}
  ~B()
  {}

  A *copy()
  {
    return this;
  }
};

int main(int argc, char **argv)
{
  B  *b1 = new B, *b2 = dynamic_cast<B *>(b1->copy());

  return 0;
}

..и здесь

class A
{
public:
  A()
  {}
  virtual ~A() = 0
  {}

  virtual A *copy() = 0;
};

class B
  :  public A
{
public:
  B()
  {}
  ~B()
  {}

  B *copy()
  {
    return this;
  }
};

int main(int argc, char **argv)
{
  B  *b1 = new B, *b2 = b1->copy();

  return 0;
}
#63
21:55, 20 июня 2010

cptAm
Понял, спс.

#64
23:09, 20 июня 2010

cptAm
Разве dynamic_cast<B *> необходимо?

#65
23:11, 20 июня 2010

Voltt
> Разве dynamic_cast<B *> необходимо?

От предка к потомку же приводим тип. В той строчке.

#66
23:19, 20 июня 2010

cptAm
Но если мы точно знаем, что это потомок, можем ограничиться static_cast, и даже так писать:

*b2 = b1->copy();

Что позволяет организовать виртуальный конструктор. Разве не?

#67
23:26, 20 июня 2010

Voltt
> Но если мы точно знаем, что это потомок, можем ограничиться static_cast

Если мы переопределим тип возвращаемого значения у виртуального метода copy, надобность в каком-либо cast'е отпадает вовсе. Что мой пример продемонстрировать был призван :) Когда работа ведется непосредственно с потомком, приведение типов ни к чему.

И мы таки сможем писать так:

*b2 = b1->copy();
#68
23:41, 20 июня 2010

cptAm
Собственно это я и хотел услышать :)

Страницы: 1 2 3 4 5
ФлеймФорумПрограммирование

Тема в архиве.