混合虚函数和重载正则函数
mixing virtual function with overload regular functions?
在项目中看到以下代码:
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"关系。
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载