在项目中看到以下代码:
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;这里有设计缺陷吗?
谢谢
答案 0 :(得分:8)
virtual
函数很好。 隐藏虚拟功能是您应该谨慎的。
在您的情况下,您将覆盖基本版本并提供两个以上的重载。所以不会发生隐藏。
答案 1 :(得分: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”关系。