混合虚函数和重载正则函数

mixing virtual function with overload regular functions?

本文关键字:函数 重载 混合      更新时间:2023-10-16

在项目中看到以下代码:

class Base
{
...
    virtual double Function(int i) const;
...
};
class SubClass : public Base
{
    virtual double Function(int i) const;
    double Function(std::vector<int> vecInts) const;
    double Function(std::map<int> mapInts) const;
};
我觉得这个设计不舒服。我知道我们应该避免虚函数过载,但这里的情况有点不同。

Question>这里有设计缺陷吗?

谢谢

不,没关系。重载virtual函数是可以的。隐藏虚函数是你应该小心的。

在您的示例中,您重写了基本版本并提供了两个以上的重载。

这不是设计缺陷。一切都很好。

  • 只要不使用动态分派,派生类中的函数将隐藏基类函数,派生类中适当的重载函数将被选择。(下面示例程序中的前3个输出)。
  • 在动态调度的情况下,将根据对象的实际类型(下面示例中的最后3个输出)调用适当的覆盖函数(记住,覆盖函数是将int作为参数的函数)。

考虑示例程序以使其更清晰:

#include<iostream>
class Base
{
public:
    virtual double Function(int i) const{std::cout<<"nIn Base int version";}
};
class SubClass : public Base
{
public:
    virtual double Function(int i) const{std::cout<<"nIn Derived int version";}
    double Function(std::string str) const{std::cout<<"nIn Derived string version";}
    double Function(double i) const {std::cout<<"nIn Derived double version";}
};
int main()
{
    SubClass obj;
    obj.Function(10);
    obj.Function(10.1);
    obj.Function("Hello"); 
    Base Bobj;
    Bobj.Function(10.2);
    Base *ptr = new Base;
    ptr->Function(10.5);
    Base *ptr2 = new SubClass; 
    ptr2->Function(10);
    ptr2->Function(10.5);
    delete ptr;
    delete ptr2;
    return 0;
}

输出为:

In Derived int version
In Derived double version
In Derived string version
In Base int version
In Base int version
In Derived int version
In Derived int version

注意最后两个输出,

没有瑕疵。来自Effective c++,条目34:

纯虚函数只指定接口继承。

简单(非纯)虚函数指定接口继承加上默认实现的继承。

非虚函数指定继承接口+强制实现的继承。

由于Function(int i)是虚函数而不是非虚函数,因此可以在基类中重写其默认实现。如果它是一个非虚函数,那么它将是一个强制实现,而不是被重写,以确保类层次结构中的"is-a"关系。