将虚函数与过载常规函数混合?

时间:2013-01-18 16:00:17

标签: c++

在项目中看到以下代码:

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;
};

我对这种设计感到不舒服。我知道我们应该避免过载虚函数,但这里的情况有点不同。

问题&GT;这里有设计缺陷吗?

谢谢

3 个答案:

答案 0 :(得分:8)

不,没关系,没关系。重载virtual函数很好。 隐藏虚拟功能是您应该谨慎的。

在您的情况下,您将覆盖基本版本并提供两个以上的重载。所以不会发生隐藏。

答案 1 :(得分:3)

这不是设计缺陷。这很好。

  • 只要您不使用动态分派,派生类中的函数将 hide 基类函数,并且将选择Derived类中相应的重载函数。(以下示例程序中的前3个输出)。
  • 在动态调度的情况下,将根据实际类型调用相应的重叠函数(记住,覆盖函数是将int作为参数的函数)。对象的em>(以下示例中的最后3个输出)。

考虑 sample program 以使其更清晰:

#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

注意具体的最后两个输出,。

答案 2 :(得分:1)

没有任何缺陷。从Effective C ++,第34项:

  

纯虚函数仅指定接口的继承。

     

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

     

非虚函数指定interface plus的继承   继承强制执行。

由于Function(int i)是虚函数而不是非虚函数,因此可以在基类中覆盖其默认实现。如果它是非虚函数,则它将是强制实现,而不是被覆盖,以确保类层次结构中的“是-a”关系。