В этом примере показано, как объект производного класса передается в функцию, которая принимает ссылку на базовый класс в качестве параметра. Функция-член g(int)
в производном классе скрывает g(float)
в базовом классе. Я понимаю это, и мой вопрос не имеет к этому отношения.
class Base {
public:
virtual void g(float x) throw()
{
cout << "Base::g(float)\n";
}
};
class Derived : public Base {
public:
virtual void g(int x) throw() // Bad: Hides Base::g(float)
{
cout << "Derived::g(int)\n";
}
};void sampleTwo(Base& b, Derived& d)
{
b.g(3.14f);
d.g(3.14f); // Bad: Converts 3.14 to 3 and calls Derived::g(int)
}
int main()
{
Derived d;
sampleTwo(d, d);
return 0;
}
Выход:
Base::g(float)
Derived::g(int)
Мой вопрос с выводом «Base :: g (float)». Поскольку объект, на который ссылается ‘b’ в sampleTwo (), является производным объектом, разве динамическая привязка не должна вызывать метод g () производного класса (преобразовывая float в int)?
g(int)
а также g(float)
два совершенно разных метода. Derived::g(int)
не переопределяет Base::g(float)
, Эти методы не связаны.
поскольку Derived
не переопределяет g(float)
Ваши ожидания по поводу b.g(3.14f)
являются необоснованными. Как и ожидалось, b.g(3.14f)
должен позвонить Base::g(float)
,
Если вы переопределите g(float)
в Derived
, затем b.g(3.14f)
действительно позвонит Derived::g(float)
,
Динамическая отправка вызывает окончательное переопределение. поскольку Derived::g
скрывает, а не отменяет Base::g
окончательный переопределение Base::g
в Derived
все еще Base::g
,
g(float)
а также g(int)
разные члены функции. Если ты хочешь Derived
работать, ты должен использовать g(float)
в обоих классах.
g()
может быть перегружен проверить функцию перегрузки:
https://en.wikipedia.org/wiki/Function_overloading
Пример (g(float)
а также g(int)
в том же классе и отдельные функции):
class Derived : public Base {
public:
void g(float x) throw();
void g(int x) throw();
};