——函数名相同?参数列表相同?返回值相同?

C++的重载给人留下了非常深刻的影响,原因是重载的条件很值得注意:函数名相同,参数列表不相同的两个函数构成重载函数,而无关乎二者的返回值。

但是C++中的函数重写又是另一码事。标准规定:只要函数名相同,就会被重写。 重写之后用子类访问“本该被继承的”父类的函数,将会调用子类的同名函数,而与父类中有什么样的同名函数无关(也就是当它不存在)。例如:


class A
{
    public:
    int func()
    {
        return 1;
    }
};

class B: public A
{
    public:
    char func(int a)
    {
        return '2';
    }
};

main()
{
    B b;
    std::cout <<b.func()<<endl;
    std::cout <<b.func(1)<<endl;
}

上面这段代码中,main函数中的b.func(1)将成功被调用,而b.func()将报错:

Untitled1.cpp|25|error: no matching function for call to 'B::func()'|

因为此时从父类那里集成而来的int func()已然被重写,即使参数列表不同,即使返回值也不同。int func()在子类B中早已不复存在了。