2013-07-05 3 views
2
#include <iostream> 

using namespace std; 

class Base { 
public: 
virtual void some_func(int f1) 
{ 
cout <<"Base is called: value is : " << f1 <<endl; 
} 
}; 

class Derived : public Base { 
public: 
virtual void some_func(float f1) 
{ 
cout <<"Derived is called : value is : " << f1 <<endl; 
} 
}; 


int main() 
{ 
int g =12; 
float f1 = 23.5F; 

Base *b2 = new Derived(); 
b2->some_func(g); 
b2->some_func(f1); 
return 0; 

} 

Выход:наиважнейших функций в C++

Base is called: value is : 12 
Base is called: value is : 23 

Почему второй вызов b2->some_func(f1) вызов функции Base класса, даже хотя есть версия с плавающей точкой в ​​качестве аргумента, имеющегося в Derived классе?

+0

Существует новое ключевое слово C++ 11 'override'. Поместите его в конце подписи метода 'some_func' в' Derived', и сообщение об ошибке поможет. – Yakk

+0

НИКОГДА не забывайте удалять указатели кучи. –

ответ

2

Вы перепутали перегрузку с переопределением, Для переопределения подпись функции должна оставаться такой же. пожалуйста, проверьте C++ документацию еще раз .. надеюсь, что это полезно

+0

+1: Хотя вы не сказали этого ясно, я понимаю, когда понимаю, что это перегрузка. – johnchen902

+0

Сначала я думал, что это связано с тем, как он создал свой класс (используя b2). Поэтому, если я правильно понял (я не знаю, что в C++), он переопределяет класс Base, но перегружает функцию some_func ??? Если это правильно, я нашел примеры в сети о том, как переопределить класс (прямоугольник -> поле ...), но как мы можем переопределить функцию – user2497624

+0

, вы переопределяете класс, переопределяя функции в этом классе с одинаковой сигнатурой, если вы не переопределяете функции в производном классе, производный класс не будет предоставлять никакого другого поведения, кроме определения нового типа. –

4
  1. Это на самом деле не отменено, поскольку его аргументы не имеют одинаковый тип.
  2. Поскольку он не переопределен, ваш указатель на Base знает только метод int, поэтому он выполняет суживающее преобразование (должно быть предупреждение) и вызывает Base::some_func(int).
+0

Спасибо за ваш ответ. Будет ли «функция сокрытия» входить в картину здесь? Я помню, что скрытие функции связано с тем же именем функции в производном классе, независимо от подписи. Я пробовал делать Derived d; d.some_func (г); Он компилируется. – user2553620

Смежные вопросы