Предотвращение наследования классов в 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