5

在项目中看到如下代码:

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

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

问题> 这里有设计缺陷吗?

谢谢

4

3 回答 3

8

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

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

于 2013-01-18T16:02:22.413 回答
3

这不是设计缺陷。很好。

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

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

#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

请注意最后两个输出。

于 2013-01-18T16:02:21.017 回答
1

没有缺陷。来自有效 C++,第 34 项:

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

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

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

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

于 2013-01-18T16:07:02.657 回答