передача производного объекта в качестве ссылочного параметра базового класса

В этом примере показано, как объект производного класса передается в функцию, которая принимает ссылку на базовый класс в качестве параметра. Функция-член 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)?

2

Решение

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),

3

Другие решения

Динамическая отправка вызывает окончательное переопределение. поскольку Derived::g скрывает, а не отменяет Base::gокончательный переопределение Base::g в Derived все еще Base::g,

1

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();

};
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector