С++: любой способ предотвратить создание экземпляра абстрактного базового класса?

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

Я могу сделать это:

class BaseFoo
{
    virtual void blah() = 0;
};

class Foo : public BaseFoo
{
    virtual void blah() {}
};

но я хотел бы избежать vtable. (согласно моему другому вопросу о виртуальных деструкторах)

Microsoft ATL имеет ATL_NO_VTABLE для этого (или, по крайней мере, я думаю, что это то, что он делает...)


person Jason S    schedule 07.06.2011    source источник
comment
Почему именно вы хотите избежать vtable? (И если вы никогда не собираетесь использовать тот факт, что метод является виртуальным, зачем вам базовый класс?)\   -  person Billy ONeal    schedule 08.06.2011


Ответы (2)


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

Это, конечно, перекладывает бремя корректности на производные классы, но, по крайней мере, базовый класс защищен.

person Blindy    schedule 07.06.2011
comment
Хороший. Но, возможно, не совсем очевидно ;-) - person Johnsyweb; 08.06.2011
comment
Что ж, очевидно по сравнению с безумными хаками шаблонов, которые я ожидал от людей! - person Blindy; 08.06.2011

Вы можете сделать защищенный конструктор

person thumbmunkeys    schedule 07.06.2011