C ++ время компиляции полиморфизм сомнения? - PullRequest
3 голосов
/ 11 апреля 2010

Программа ниже содержит две функции show () в родительском и дочернем классах, но первая функция show () принимает аргумент FLOAT, а вторая функция show () принимает аргумент INT.

. Если я вызываю функцию show (10.1234), передавая аргумент float, она должна вызывать функцию show (float a) класса A, но она вызывает функцию show b (int b) класса B.

#include<iostream>
using namespace std;

class A{
        float a;
public:
        void show(float a)
        {
                this->a = a;
                cout<<"\n A's show() function called : "<<this->a<<endl;
        }
};

class B : public A{
        int b;
public:
        void show(int b)
        {
                this->b = b;
                cout<<"\n B's show() function called : "<<this->b<<endl;
        }
};

int main()
{
        float i=10.1234;
        B Bobject;
        Bobject.show((float) i);
        return 0;
}

Выход:

B's show() function called : 10

Ожидаемый результат:

A's show() function called : 10.1234

Почему компилятор g ++ выбран неправильно show() функция, т. Е. class B show(int b) функция?

Ответы [ 5 ]

12 голосов
/ 11 апреля 2010

Если в производном классе есть функция, имя которой совпадает с именем функции в базовом классе, она скрывает все функции в базовом классе. Вам нужно либо переименовать вашу функцию, либо использовать объявление using в вашем производном классе:

using A::show;

или вы можете явно вызвать функцию базового класса:

Bobject.A::show(i);
1 голос
/ 11 апреля 2010

Когда вы определяете имя в производном классе, оно скрывает имя от базового класса.

Вы можете достичь того, чего хотите, добавив это в определение B:

using A::show;

Это позволит вам использовать как шоу А (), так и шоу Б ().

1 голос
/ 11 апреля 2010

Вы смешиваете вещи:
Если у вас было 2 функции в class A со следующими сигнатурами:
void Show(int a);
void Show(float a);

Тогда компиляторы выбрали бы «правильную» функцию.

1 голос
/ 11 апреля 2010

Используйте объявление using.

class B : public A{
        int b;
public:
        using A::show;
        …
};
1 голос
/ 11 апреля 2010

Здесь нет полиморфизма. Вы должны объявить свои функции virtual, чтобы сделать их полиморфными, и сделать так, чтобы они имели одинаковую подпись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...