C ++编译时多态性有疑问吗?

时间:2010-04-11 13:58:18

标签: c++ polymorphism

下面的程序在父类和子类中包含两个show()函数,但是第一个show()函数接受FLOAT参数,第二个show()函数接受INT参数。

。如果我通过传递float参数调用show(10.1234)函数,它应该调用类A的show(float a)函数,但它调用类B的show(int 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的{​​{1}}函数?

5 个答案:

答案 0 :(得分:12)

如果在派生类中有一个与基类中的函数同名的函数,它会隐藏基类中的所有函数。您需要重命名函数,或在派生类中使用using声明:

using A::show;

或者,您可以显式调用基类函数:

Bobject.A::show(i);

答案 1 :(得分:1)

这里没有涉及多态性。您应该声明函数virtual以使它们具有多态性,并使它们具有相同的签名。

答案 2 :(得分:1)

使用using声明。

class B : public A{
        int b;
public:
        using A::show;
        …
};

答案 3 :(得分:1)

你在混合东西:
如果您在class A中有2个具有以下签名的功能:
void Show(int a);
void Show(float a);

然后编译将选择“正确”的功能。

答案 4 :(得分:1)

在派生类中定义名称时,它会隐藏基类中的名称。

您可以通过将此添加到B的定义来实现您想要的目标:

using A::show;

这将让你同时使用A的show()和B的show()。