Стандартный способ С++ для создания абстрактного класса (чистый виртуальный класс)

Начну с того, что большинство из нас уже знает:

Если я хочу, чтобы мой класс был абстрактным, я должен определить хотя бы один из его методов как «чисто виртуальный», например, здесь метод someFunction() определен как «чисто виртуальный», так как он определен с помощью ключевого слова virtual, и он назначается с 0:

class SomeClass {
    virtual void someFunction() = 0;
};

Мой вопрос в том, когда мне нужен "абстрактный класс", то есть класс, который не может быть создан (например, "чистый виртуальный" класс), но я хочу реализовать все его методы. Есть ли какой-то стандартный способ сделать это?

Мой текущий обходной путь уродлив - я просто определяю еще один фиктивный чисто виртуальный метод:

class UglyWorkaround {
    public:
        virtual void doAction1();
        virtual void doAction2();

        // My ugly workaround for making the class abstract - defining a dummy method
        virtual void thisIsADummyMethod() = 0;
};

Это очень плохо, так как любой производный неабстрактный класс должен будет реализовать это

Есть ли более стандартный/популярный способ определить и реализовать такой класс?

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


person SomethingSomething    schedule 26.10.2015    source источник


Ответы (1)


Определить защищенный конструктор

person fjardon    schedule 26.10.2015
comment
На первый взгляд звучит красиво, но это не помешает вам создавать экземпляры вашего класса из его методов. - person SomethingSomething; 26.10.2015
comment
@SomethingSomething, если методы не статичны, то как их вызывать? Если они статические, то, скорее всего, это фабричные методы, которые должны иметь возможность вызывать ctor. C++ не может читать мысли программистов. Если они сделают что-то не так, то программа сделает именно то, о чем ее просили. - person kay; 26.10.2015
comment
Я согласен. Если ваши методы not статические, они не смогут работать, так как у вас должен быть экземпляр, который никто не сможет создать. Но если ваши методы are статические, то кто-нибудь может их запустить и создать экземпляры. Я хочу, чтобы класс был полностью абстрактным, как класс, определенный в Java с помощью ключевого слова abstract. Я хочу заблокировать любую попытку создать экземпляр не с помощью дочернего конструктора. - person SomethingSomething; 26.10.2015
comment
Будет ли #define ABSTRACT /*void*/ например. ABSTRACT class Animal {...}; работает на вас? - person kay; 26.10.2015