Класс со статической функцией должен быть сделан абстрактным базовым классом в C ++ - PullRequest
0 голосов
/ 24 декабря 2008

Есть вариант использования, где

Class foo {

public:

  static std::string make(std::string a) { .. }

}

Я хочу сделать foo абстрактным базовым классом, но очевидно, что make не может быть в этой абстрактной базе, поскольку виртуальные функции не могут быть статическими.

Как это

Class foo {

public:
   static virtual std::string make (std::string) = 0; //error this cannot be done 

}

Class fooImpl: foo{

public:
   std::string make(std::string a) { ..}
}

Делает метод нестатичным в абстрактном классе или у производных классов есть статические методы, хороший подход с точки зрения проектирования.

Ответы [ 3 ]

3 голосов
/ 24 декабря 2008

Вы можете сделать деструктор чисто виртуальной функцией:

class foo {
  public:
    virtual ~foo() = 0;
}

Вам просто необходимо убедиться, что в любом случае предоставлена ​​реализация для деструктора:

foo::~foo() {}

Edit:
Поэтому у вас есть класс, из которого можно получить производные, но сам по себе он не может быть создан.

1 голос
/ 24 декабря 2008

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

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

base& somefunction(); // may return base or derived objects
base &b = somefunction();
b.method();

Теперь, если метод поведение изменится с base на производное и вам нужно поведение реального экземпляра , на который вы ссылаетесь тогда вам нужен полиморфизм и, следовательно, виртуальный метод. Тот факт, что метод может использовать или не использовать данные элемента, не имеет значения, важная часть заключается в том, что это поведение привязано к конкретному экземпляру.

С другой стороны, статические методы связаны с классом. То есть, это поведение класса, с которым вы имеете дело, а не поведение ссылающегося экземпляра. Таким образом, даже если приведенный выше синтаксис можно использовать, он вызовет статический метод в классе base , поскольку это тот класс, с которым вы имеете дело.

Нет оснований определять, что какой-либо из вариантов дизайна, с которым вы работаете, лучше, чем другой, без более глубокого знания предметной области. Я надеюсь, что приведенные выше рассуждения помогут вам принять решение.

0 голосов
/ 24 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...