netstat -plant | awk '$4 ~ /:80\>/ {print}' | wc -l
Это покажет Вам все соединения с сервером Apache. Можно создать cgi сценарий, который вычислит общее количество соединений с сервисом Apache и выпустит предупреждение, как только это достигает определенного порога. То, что сделать в той точке, является другим вопросом.
, Надо надеяться, Ваш сервер подготовлен.
Если вы хотите разрешить преобразование , вам следует использовать общедоступное наследование.
Используя защищенное или частное наследование, вы заявляете, что тот факт, что производный тип наследуется от базового класса, является деталью, которая не должна быть видна извне: вот почему вы получаете это ошибка.
Непубличное наследование следует рассматривать только как форму композиции с добавленной возможностью переопределения методов.
Проблема в том, что вы пытаетесь выполнить завершающий обход скрытой информации, которую предоставляет атрибут protected . Если вы хотите получить доступ к экземпляру D как к B, почему вы унаследовали его как защищенный, а не открытый? При использовании защищенного наследования вы хотите, чтобы только экземпляры D и его потомков знали о компоненте B. Вам нужно еще раз взглянуть на то, чего вы хотите достичь.
Используемое вами старое приведение стиля C не имеет тонкости, присущего новым приведениям C ++, поэтому он дает вам код, который будет компилироваться, но проблема на самом деле заключается в наследовании .
Потому что из детей D и D никто не знает, что они являются родителями-потомками, поэтому вам нужно сделать это явно.
Вот что означает защищенное наследование, только ваша семья (дети) будет знать, что вы унаследуете. И вы можете использовать его, например, в дочернем методе, там неявное преобразование будет законным.
Если вы хотите иметь неявное преобразование из ваших детей, вам нужно сделать его общедоступным, чтобы все знали.
Поскольку protected
и частное
наследование не являются отношениями is-a
, они просто синтаксический сахар для композиции. Ваши классы могут быть переписаны именно так, но вы теряете удобство, позволяя компилятору определять b
для вас и использовать элементы b напрямую вместо того, чтобы ссылаться на них явно:
class D
{
protected:
B b;
};
Для второго пункта вашего вопрос:
operator B() {return *this;}
Эта строка имеет отношение к B
и D
. D * и B * полностью отличаются от B и D, хотя они являются указателями на них! для приведения указателей вы можете переинтерпретировать указатель:
B *p = reinterpret_cast<B*>(&d); // TOTALLY WRONG, although it compiles :)
Не делайте приведенную выше строку! Думаю, вы могли бы дать нам больше информации о том, чего пытаетесь достичь.
Вы пытались сделать оператор B () общедоступным в классе D? В показанном вами коде он будет отмечен как защищенный и по-прежнему недоступный. Но я бы по возможности избегал операторов преобразования вообще.
Тем не менее, наследование защищенного B означает, что вы намерены предотвратить выполнение B * p = & d. Представьте, что B на самом деле была защищенной переменной-членом в верхней части D. Точно так же, как вы не можете получить доступ к Db в этом случае, вы не можете получить доступ к d как B *, если вы не отбросите его. B публично или используйте свои слепки. Я бы пошел с наследованием B публично, потому что его защищенное наследование в основном говорит: «Не используйте меня как B», что вы все равно пытаетесь сделать.