class base {
public:
void virtual fn(int i) {
cout << "base" << endl;
}
};
class der : public base{
public:
void fn(char i) {
cout << "der" << endl;
}
};
int main() {
base* p = new der;
char i = 5;
p->fn(i);
cout << sizeof(base);
return 0;
}
Здесь подпись функции fn, определенной в классе base
, отличается от сигнатуры функции fn()
, определенной в классе der
, хотя имя функции такое же. Следовательно, функция, определенная в классах der
, скрывает base
функция класса fn()
. Таким образом, класс der
версии fn не может быть вызван вызовом p->fn(i)
; Это нормально.Почему vptr требуется, когда производный класс не переопределяет виртуальную функцию?
Моя точка, то почему sizeof
класс base
или der
является 4
если нет использования указателя виртуальных таблиц? Что требуется для VTABLE указатель здесь?
Вы когда-нибудь слышали о перегрузке на C++? –
@KamilKlimek: Перегрузка - это акт объявления нескольких функций с различными сигнатурами. Вероятно, вы имеете в виду переопределение (это переопределение методов в производных классах). –
для вашей любезной информации, это не перегруженная функция. – user966379