C++: някакъв начин да се предотврати всякакво създаване на абстрактен базов клас?

Освен наличието на чиста виртуална функция, има ли начин да се предотврати инстанциране на абстрактен базов клас?

Мога да го направя:

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