Если строка, которую вам нужно добавить, это SVG, и вы добавляете правильное пространство имен, вы можете проанализировать строку как XML и добавить к родительскому.
var xml = jQuery.parseXML('<circle xmlns="http://www.w3.org/2000/svg" cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/>');
$("svg").append(xml.documentElement))
Вероятно, настоящая причина того, что чистые виртуальные деструкторы разрешены, заключается в том, что их запрет означал бы добавление еще одного правила к языку, и в этом правиле нет необходимости, поскольку разрешение чистый виртуальный деструктор.
Нет, достаточно старого обычного виртуального.
Если вы создаете объект с реализациями по умолчанию для его виртуальных методов и хотите сделать его абстрактным, не заставляя кого-либо переопределять какой-либо конкретный метод, вы можете сделать деструктор чисто виртуальным. Я не вижу в этом особого смысла, но это возможно.
Обратите внимание, что, поскольку компилятор будет генерировать неявный деструктор для производных классов, если автор класса этого не сделает, любые производные классы будут не абстрактными. Поэтому наличие чистого виртуального деструктора в базовом классе не повлияет на производные классы. Это сделает только базовый класс абстрактным (спасибо за комментарий @kappa ).
Можно также предположить, что каждому производному классу, вероятно, потребуется иметь определенный код очистки и использовать чистый виртуальный деструктор в качестве напоминания о необходимости написать его, но это кажется надуманным (и необязательным).
Примечание: Деструктор - единственный метод, который, даже если он чисто виртуальный , имеет иметь реализацию для создания экземпляров производных классов (да, чистые виртуальные функции могут иметь реализации).
struct foo {
virtual void bar() = 0;
};
void foo::bar() { /* default implementation */ }
class foof : public foo {
void bar() { foo::bar(); } // have to explicitly call default implementation.
};
Все, что вам нужно для абстрактного класса, - это хотя бы одна чистая виртуальная функция. Подойдет любая функция; но на самом деле деструктор - это то, что любой класс будет иметь, поэтому он всегда присутствует в качестве кандидата. Более того, создание чисто виртуального деструктора (в отличие от просто виртуального) не имеет побочных поведенческих эффектов, кроме как сделать класс абстрактным. Таким образом, многие руководства по стилю рекомендуют последовательно использовать чистый виртуальный дестуктор, чтобы указать, что класс является абстрактным - хотя бы по той причине, что он обеспечивает согласованное место, где кто-то, читающий код, может посмотреть, является ли класс абстрактным.
Если вы хотите создать абстрактный базовый класс:
... это самый простой чтобы сделать класс абстрактным, сделав деструктор чисто виртуальным и предоставив для него определение (тело метода).
Для нашей гипотетической ABC:
Вы гарантируете, что он не может быть создан (даже внутри самого класса, поэтому частных конструкторов может быть недостаточно), вы получаете виртуальное поведение, которое хотите для деструктора, и вам не нужно искать и помечать другой метод, который не требует виртуальной диспетчеризации как «виртуальный».
1) Если вы хотите, чтобы производные классы выполняли очистку. Это редко.
2) Нет, но вы хотите, чтобы это было виртуально.