Виртуальная функция C++ от конструктора [дубликат]

Для меня ответ @ hitzg приводит к тому, что «OverflowError: signed integer больше максимального» в глубинах DateFormatter.

. Посмотрев на мою фреймворк, мои индексы имеют datetime64, а не datetime. Панда преобразует их красиво. Для меня отлично работает:

import matplotlib as mpl

def myFormatter(x, pos):
    return pd.to_datetime(x)

[ . . . ]

ax.xaxis.set_major_formatter(mpl.ticker.FuncFormatter(myFormatter))
57
задан Giovanni Funchal 30 January 2009 в 17:37
поделиться

5 ответов

Поскольку base создается сначала и еще не "назрел" в derived. Это не может назвать методы на объекте, когда это не может гарантировать, что объект уже правильно инициализируется.

90
ответ дан Sean Bright 7 November 2019 в 15:58
поделиться

Вы не должны полиморфно , называют виртуальные методы от конструктора. Вместо этого можно назвать их после конструкции объекта.

Ваш код может быть ре, записанным следующим образом

struct base {
   virtual const int value() const {
      return 0;
   }
   base() {
      /* std::cout << value() << std::endl; */
   }
   virtual ~base() {}
};

struct derived : public base {
   virtual const int value() const {
      return 1;
   }
};

int main(void) {
   derived example;
   std::cout << example.value() << std::endl;
}
4
ответ дан pasha 7 November 2019 в 15:58
поделиться

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

20
ответ дан CB Bailey 7 November 2019 в 15:58
поделиться

Общее правило - Вы, не вызывают виртуальную функцию от конструктора.

0
ответ дан Hank Gay 7 November 2019 в 15:58
поделиться

На самом деле существует способ получить это поведение. "Каждая проблема в программном обеспечении может быть решена с уровнем абстракции".

/* Disclaimer: I haven't done C++ in many months now, there might be a few syntax errors here and there. */
class parent
{
public:
     parent( ) { /* nothing interesting here. */ };
protected:
     struct parent_virtual
     {
         virtual void do_something( ) { cout << "in parent."; }
     };

     parent( const parent_virtual& obj )
     {
          obj.do_something( );
     }
};

class child : public parent
{
protected:
     struct child_virtual : public parent_virtual
     {
         void do_something( ) { cout << "in child."; }
     };
public:
      child( ) : parent( child_virtual( ) ) { }
};
9
ответ дан Tanveer Badar 7 November 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: