Я нахожу свой файл css и добавляю к нему маршрут:
app.get('/css/MyCSS.css', function(req, res){
res.sendFile(__dirname + '/public/css/MyCSS.css');
});
Тогда он работает.
Виртуальные деструкторы полезны, когда Вы могли бы потенциально удалить экземпляр производного класса через указатель на базовый класс:
class Base
{
// some virtual methods
};
class Derived : public Base
{
~Derived()
{
// Do some important cleanup
}
};
Здесь, Вы заметите, что я не объявил, что деструктор Основы был virtual
. Теперь, давайте взглянем на следующий отрывок:
Base *b = new Derived();
// use b
delete b; // Here's the problem!
, Так как деструктор Основы не virtual
, и b
Base*
указывающий Derived
, объект, delete b
имеет неопределенное поведение :
[В
delete b
], если статический тип объекта, который будет удален, отличается от своего динамического типа, статический тип должен быть базовым классом динамического типа объекта, который будет удален и , статический тип должен иметь виртуальный деструктор, или поведение не определено .
В большинстве реализаций, вызов к деструктору будет разрешен как любой невиртуальный код, означая, что деструктор базового класса назовут, но не тот производного класса, приводящего к утечке ресурсов.
Таким образом, всегда делают деструкторы базовых классов virtual
, когда они предназначены, чтобы управляться полиморфно.
, Если Вы хотите предотвратить удаление экземпляра через указатель базового класса, можно сделать деструктор базового класса защищенным и невиртуальным; путем выполнения так, компилятор не позволит Вам звонить delete
на указателе базового класса.
можно узнать больше о виртуальности и виртуальном деструкторе базового класса в [1 112] эта статья от Herb Sutter .
Сделайте деструктор виртуальным каждый раз, когда Ваш класс является полиморфным.
bool
, но не bool
. В частности, преобразования от и до Вашего типа (говорят int
) будут пользовательские преобразования а не интегральные продвижения , и может быть самое большее одно неявное определяемое пользователем преобразование в любой допустимой последовательности преобразования. Вы не можете заменить всем использованием bool
с Bool
, поскольку некоторые из них не скомпилируют.
– David Rodríguez - dribeas
24 September 2013 в 16:04
Объявите деструкторы, виртуальные в полиморфных базовых классах. Это - Объект 7 в Scott Meyers Эффективный C++ . Meyers продолжает суммировать это, если класс имеет какой-либо виртуальная функция, он должен иметь виртуальный деструктор и это, классы, не разработанные, чтобы быть базовыми классами или не разработанные, чтобы использоваться полиморфно, должны не , объявляют виртуальные деструкторы.
Также знайте что, удаляя указатель базового класса, когда нет никакого виртуального деструктора, приведет к неопределенное поведение . Что-то, что я изучил просто недавно:
, Как должен, переопределяя, удаляют в C++, ведут себя?
я использовал C++ в течение многих лет, и мне все еще удается подвесить меня.
T& operator*();
. Патологическая реализация могла принять весь , доступные комбинации двоичных разрядов представляют одну из истины и лжи, и каждый раз, когда Вы пишете x = true;
, случайным образом выбирают один из эти true
шаблоны. Это не оставляет Вас никаким стабильным шаблоном для представления дополнительного " none" состояние. Так как необходимо обеспечить ссылку на объект с оператором*, Вы должны иметь bool
там где-нибудь. Отметьте это vector< bool> работы вокруг этого с теми страшными прокси.
– R. Martinho Fernandes
24 September 2013 в 16:12