Jim Coplien значится в рецензентах и «благодарностях» к многим книгам других известных авторов, даже у Страуструпа по-моему… Так что, возможно, Вы его уже читали :)
Если есть шанс того, что Вы будете вносить подобные изменения, их нужно предусмотреть на этапе проектирования, а значит — подобный «мегахак» не для Вас.
Можно, к примеру, сделать лексический анализатор, который будет использовать виртуальный конструктор для создания определенного вида лексем на основе какой-то входной инфы…
А во-вторых, я не заставляю Вас пользоваться описанной методикой. Если она Вам не подходит, то это еще не означает, что она бесполезна. У всех паттернов есть свои достоинства и недостатки.
Не нахожу. Именно за счет этого, С++ гибкий и мощный язык, хоть и сложный.
В случае
class A {};
class B: public A {
char m_str[1000];
}
int main() {
A * pA = new B;
delete pA;
return EXIT_SUCCESS;
}
утечка, полагаю, все-таки произойдет, потому деструктор класса B вызван не будет. А если он не будет вызван, то кто должен освобождать память, занятую данными объекта B?
Если вам непонятно, могу добавить какую-нибудь левую виртуальную функцию в базовый класс. Я сделал виртуальный деструктор для того чтобы объяснить, как пойдут дела в таком случае.
А правило такое потому, что если в базовом классе нет виртуальных функций, то вряд ли есть особый смысл обращаться к производным классам через указатель на базовый, и наоборот — если в базовом виртуальные функции есть, то практически наверняка вы будете обращаться к нему и его потомкам через указатель.
Если что-то можно не писать, то лучше это все-таки написать, за исключением случаев, когда эта особенность настолько известна, что её знают все как дважды два.
Это плата за то чтобы клиент базового класса о потомках даже не подозревал.
А во-вторых, я не заставляю Вас пользоваться описанной методикой. Если она Вам не подходит, то это еще не означает, что она бесполезна. У всех паттернов есть свои достоинства и недостатки.
Кстати, «письмо и конверт» — это, можно сказать, особый вид паттерна State.
Графика, конечно, не как в .kkrieger, но и места занимает в полторы тысячи раз меньше. Респект.
В случае
утечка, полагаю, все-таки произойдет, потому деструктор класса B вызван не будет. А если он не будет вызван, то кто должен освобождать память, занятую данными объекта B?
А правило такое потому, что если в базовом классе нет виртуальных функций, то вряд ли есть особый смысл обращаться к производным классам через указатель на базовый, и наоборот — если в базовом виртуальные функции есть, то практически наверняка вы будете обращаться к нему и его потомкам через указатель.