Предотвращение наследования классов в C ++

Недавно один из моих друзей спросил меня, как предотвратить наследование классов в C ++. Он хотел, чтобы компиляция провалилась.

Я думал об этом и нашел 3 ответа. Не уверен, что это лучший.

1) Частный конструктор (ы)

class CBase
{

public:

 static CBase* CreateInstance() 
 { 
  CBase* b1 = new CBase();
  return b1;
 }

private:

 CBase() { }
 CBase(CBase3) { }
 CBase& operator=(CBase&) { }


};

2) Использование базового класса CSealed, частного ctor и виртуального наследования

class CSealed
{

private:

 CSealed() {
 }

 friend class CBase;
};


class CBase : virtual CSealed
{

public:

 CBase() {
 }

};

3) Использование базового класса CSealed, защищенного ctor и виртуального наследования

class CSealed
{

protected:

 CSealed() {
 }

};

class CBase : virtual CSealed
{

public:

 CBase() {
 }

};

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

1) Какой метод самый лучший? Любые другие методы доступны?

2) Методы 2 и 3 не будут работать, если класс CSealed не унаследован виртуально. Это почему ? Это как-то связано с vdisp ptr ??

PS:

Вышеуказанная программа была скомпилирована в компиляторе MS C ++ (Visual Studio). ссылка :http://www.codeguru.com/forum/archive/index.php/t-321146.html

Ответы на вопрос(9)

Ваш ответ на вопрос