Я хотел спросить о конкретном моменте, сделанном в Effective С++.
В нем говорится:
Деструктор должен быть виртуальным, если класс должен действовать как полиморфный класс. Далее добавляется, что, поскольку
std::string
не имеет виртуального деструктора, его никогда не следует выводить. Кроме того,std::string
даже не предназначен для базового класса, забудьте полиморфный базовый класс.
Я не понимаю, что конкретно требуется в классе для того, чтобы быть базовым (не полиморфным)?
Является единственной причиной, по которой я не должен выходить из класса std::string
, у нее нет виртуального деструктора? Для целей повторного использования базовый класс может быть определен, и из него может наследоваться несколько производных классов. Итак, что делает std::string
не приемлемым как базовый класс?
Кроме того, если существует базовый класс, чисто определенный для цели многократного использования, и существует много производных типов, есть ли способ предотвратить выполнение клиентом Base* p = new Derived()
, потому что классы не предназначены для использования полиморфно?