Недавно один из моих друзей спросил меня, как предотвратить наследование класса на 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 базовый класс, частный т е р & виртуальное наследование
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
Добавление макроса в микс не делает это новым решением. –