G производного класса назовут. Если Вы хотите вызвать функцию в основе, звоните
Base::g();
вместо этого. Если Вы хотите назвать полученный, но все еще хотеть иметь базовую версию названы, расположение, что полученная версия g называет базовую версию в своем первом операторе:
virtual void g() {
Base::g();
// some work related to derived
}
то, что функция от основы может назвать виртуальный метод и управление, передается в производный класс, используется в шаблонном шаблоне разработки метода. Для C++ это более известно как Non-Virtual-Interface. Это широко используется также в библиотеке стандарта C++ (потоковые буферы C++, например, имеют функции pub...
, которые вызывают виртуальные функции, которые делают реальную работу. Например pubseekoff
вызовы защищенный seekoff
). Я записал пример этого в этом ответе: , Как Вы проверяете object’s внутреннее состояние?
printf ()
и друзья предназначены для обычного использования. vprintf ()
и друзья предназначены для тех случаев, когда вы хотите написать свою собственную printf ()
-подобную функцию. Допустим, вы хотите написать функцию для вывода ошибок:
int error(char *fmt, ...)
{
int result;
va_list args;
va_start(args, fmt);
// what here?
va_end(args);
return result;
}
Вы заметите, что вы не можете передать args
в printf ()
, поскольку printf ()
принимает много аргументов, а не один va_list
аргумент. Однако функции vprintf ()
, действительно принимают аргумент va_list
вместо переменного числа аргументов, так что вот завершенная версия:
int error(char *fmt, ...)
{
int result;
va_list args;
va_start(args, fmt);
fputs("Error: ", stderr);
result = vfprintf(stderr, fmt, args);
va_end(args);
return result;
}
Вы никогда не захотите использовать vprintf ()
напрямую, но это невероятно удобно, когда вам нужно, например, обернуть printf ()
. Для этих случаев вы определите функцию верхнего уровня с переменными аргументами (...). Затем вы соберете их в va_list
, выполните свою обработку и, наконец, вызовите vprintf ()
в va_list
, чтобы распечатать распечатку.