C ++ Принудительное переопределение метода в конкретном классе

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

Я также посмотрел на шаблон метода шаблона, но это тоже не совсем то, что я ищу.

10
задан Jonnster 4 November 2011 в 15:47
поделиться

1 ответ

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

#include <iostream>

struct Base{
  virtual void print() {std::cout << "Base" << std::endl; }  
};

struct RequireOverride {
  virtual void print() = 0;   
};

struct D1: Base, RequireOverride {
  virtual void print() {std::cout << "D1" << std::endl; }  
};

struct D2: Base, RequireOverride {
  // no override of function print() results in a compilation error
  // when trying to instantiate D2
};


int main() {
  D1 d1;
  d1.print(); //ok


  //D2 d2; // ERROR: cannot declare variable 'd2' to be of abstract type 'D2'
           // because the following virtual functions are pure within 'D2':
           // virtual void RequireOverride::print()
  return 0;
}

, Если у Вас есть несколько методов, для которых Вы хотите осуществить существование переопределений, затем можно поместить всех их в RequireOverride или определить больше структур нескольким - наследовались, такой как RequireOverrideMethod1, RequireOverrideMethod2, согласно контексту.

0
ответ дан 4 December 2019 в 03:11
поделиться
Другие вопросы по тегам:

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