2010-10-15 1 views
1

От ссылки http://www.coolinterview.com/interview/10842/Есть ли способ написать класс, чтобы ни один класс не мог унаследовать от него?

Есть ли способ написать класс, чтобы ни один класс не мог наследоваться от него?

С предложениями в приведенной выше ссылке, я попытался ниже код

class A 
{ 
    A(){} 
    ~A(){} 
    A(const A&); 
    A& operator=(const A&); 
}; 

class B: public A 
{ 
}; 

выше код не вызывает каких-либо ошибок. Если я пытаюсь создать экземпляр B, как показано ниже

int main() 
{ 
    B ob; 
} 

то это дает ошибку

ошибка C2248: 'A :: A': не может получить доступ к закрытый член объявлен в классе 'A'

Таким образом, наследование разрешено, но экземпляры его не позволяют.

Есть ли другой способ блокировки наследования?

+4

Проверьте это ... http://www2.research.att.com/~bs/bs_faq2.html#no-derivation .. Это будет полезной .. – liaK

ответ

0

Не существует эквивалента ключевому слову final в Java или C 0's sealed в C++. Вы, конечно же, можете запретить наследование, сделав частные конструкторы классов закрытыми или следуя ссылке liaK и имея подкласс класса, который имеет частные конструкторы и является его другом.

В общем, хотя:

Вы можете просто сделать свой деструктор невиртуальном сигнала, что вы не добиваетесь класс полиморфный, а также документа, что это ваше намерение. Конечно, если пользователи вашего класса решают проигнорировать это, они могут столкнуться с собственными проблемами для своей высокой хитрости. ;)

Дополнительно: http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.11

+0

Конструкторы не могут быть виртуальными. Если вы имели в виду деструкторов, то они либо забыли, либо действительно решили сделать деструктор не виртуальным, чтобы указать, что вы не должны быть подклассифицированы от них или сделать это действительно тяжело для вас. На моей работе мы используем не виртуальный деструктор, чтобы сигнализировать о намерении, и это также практика, упомянутая в * Эффективном C++ *. Если ваши клиенты хорошо себя ведут (я знаю, я знаю), то документирования ваших ограничений будет достаточно. – birryree

+0

Программисты на С ++ забывают постоянно создавать конструкторы. Я бы не использовал его как метод сигнализации. Edit: И конструкторами я имел в виду деструкторов, извините. – Spike

0

Не через явное ключевое слово. Некоторые языки имеют «запечатанное» ключевое слово или подобное, что делает именно это, но не C++.

Это может быть сделано (см. Полезный комментарий от liaK), но это действительно неудобно, у вас должна быть действительно веская причина, чтобы хотеть это сделать.

+0

ключевое слово seealed присутствует в нестандартном C++ (MSVC++). Но это может только остановить переопределение виртуальных функций. – bjskishore123

+0

@ bjskishore123: Хех. Я много лет использую MSVC++, но я старался и не использовал * любые * его нестандартные функции. По крайней мере, нарочно. Раньше я был укушен несоблюдением, но это еще одна история. В любом случае, я никогда не нашел по-настоящему веской причины прекратить наследование. – Spike

Смежные вопросы