Недавно один из моих друзей спросил меня, как предотвратить наследование класса на С++. Он хотел, чтобы компиляция потерпела неудачу.
Я думал об этом и нашел 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 С++ (Visual Studio). ссылка: http://www.codeguru.com/forum/archive/index.php/t-321146.html
