Родительский класс C++, вызывающий дочернюю виртуальную функцию

Я не уверен, что это утверждение верно

DynamoDB лучше всего работает с одной таблицей на приложение

Вы не против поделиться, где вы видели это? DynamoDB действительно работает лучше всего, если схема таблицы построена на основе шаблонов доступа к приложению. Это не обязательно означает, что вы должны уместить все в одном столе.

12
задан David Nehme 4 November 2008 в 16:05
поделиться

7 ответов

19
ответ дан 2 December 2019 в 05:16
поделиться

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

Существует два решения:

  1. Выполните вызов для Обработки () в конструкторе производного класса
  2. определите пустое тело функции для Процесса как в следующем примере:
class parent
{
  public:
    void Read() { //read stuff }
    virtual void Process() { }
    parent() 
    {
        Read();
        Process();
    }
}
2
ответ дан 2 December 2019 в 05:16
поделиться

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

2
ответ дан 2 December 2019 в 05:16
поделиться

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

4
ответ дан 2 December 2019 в 05:16
поделиться

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

class parent
{
  public:
    void Read() { /*read stuff*/ }
    virtual void Process() = 0;
    parent()
    {
        Read();
    }
};

class child: public parent
{
  public:
    virtual void Process() { /*process stuff*/ }
    child() : parent() { }
};

template<typename T>
class Processor
{
    public:
        Processor()
            :processorObj() // Pass on any args here
        {
            processorObj.Process();
        }
    private:
        T   processorObj;

};




int main()
{
   Processor<child> c;
}
0
ответ дан 2 December 2019 в 05:16
поделиться

Поверхностная проблема состоит в том, что Вы вызываете виртуальную функцию, это еще не известно (Объекты создаются от Родителя до Ребенка, таким образом так vtables). Ваш компилятор предупредил Вас об этом.

Существенная проблема, насколько я вижу, состоит в том, что Вы пытаетесь снова использовать функциональность наследованием. Это - почти всегда плохая идея. Вопросы проектирования, так сказать :)

По существу Вы пытаетесь инстанцировать Шаблонного шаблона Метода, отделиться какой от когда: сначала считайте некоторые данные (в некотором роде), затем обработайте их (в некотором роде).

Это будет, вероятно, намного лучше работать с агрегированием: дайте функцию Обработки Шаблонному методу, который назовут в правильное время. Возможно, можно даже сделать то же для функциональности Read.

Агрегирование может быть сделано двумя способами:

  1. Использование виртуальных функций (т.е. Привязка Времени выполнения)
  2. Используя шаблоны (т.е. Время компиляции, Связывая)

Пример 1: привязка во время выполнения

class Data {};
class IReader    { public: virtual Data read()            = 0; };
class IProcessor { public: virtual void process( Data& d) = 0; };

class ReadNProcess {
public:
    ReadNProcess( IReader& reader, IProcessor processor ){
       processor.process( reader.read() );
    }
};

Пример 2: время компиляции связывая

template< typename Reader, typename Writer > // definitely could use concepts here :)
class ReadNProcess {
public:
     ReadNProcess( Reader& r, Processor& p ) {
         p.process( r.read() );
     }
};
0
ответ дан 2 December 2019 в 05:16
поделиться

С одним шагом больше Вы могли просто представить некоторую функцию как

class parent
{
    public:
        void initialize() {
            read();
            process();
        }
}
2
ответ дан 2 December 2019 в 05:16
поделиться
Другие вопросы по тегам:

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