Недавно один из моих друзей спросил меня, как предотвратить наследование классов в 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 и virtualнаследование
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