C++ 纯虚函数的重载

C++ 纯虚函数的重载,c++,oop,design-patterns,overloading,pure-virtual,C++,Oop,Design Patterns,Overloading,Pure Virtual,我通常使用纯虚函数来实现代码所需的方法。因此,我创建接口,然后其他用户实现其派生类。派生类只有这些虚拟函数是公共的,而一些附加方法应该实现为私有的,因为我的代码不调用它们。 我不知道这是否是OOP的一个好实践(有设计模式吗?)。 无论如何,我的问题是: 用户是否可以重载纯虚拟函数 i、 e 解决办法可以是: virtual void foo(int,double,double=0)=0; 在基类中,但它非常有限。你觉得怎么样 你不能 假设您有一个Base指针,指向一个派生的对象。拥有Base

我通常使用纯虚函数来实现代码所需的方法。因此,我创建接口,然后其他用户实现其派生类。派生类只有这些虚拟函数是公共的,而一些附加方法应该实现为私有的,因为我的代码不调用它们。 我不知道这是否是OOP的一个好实践(有设计模式吗?)。 无论如何,我的问题是: 用户是否可以重载纯虚拟函数

i、 e

解决办法可以是:

 virtual void foo(int,double,double=0)=0;
在基类中,但它非常有限。你觉得怎么样

你不能


假设您有一个
Base
指针,指向一个
派生的
对象。拥有
Base
指针,您只能“访问”
Base
的界面(除非您转换为
派生的
指针,但这不是您需要的)。

重载函数只是一个与另一个同名的函数,但接受不同的参数集,也就是说,它是一种不同的功能。它与一个或多个重载函数是否为虚拟函数无关


在您介绍的示例中,我相信用户可以重载纯虚拟函数,但只有在重写它之后。而且您无法直接从基类访问函数-您需要将基类指针强制转换为派生类指针。

这两个函数不同。后者并没有凌驾于前者之上

virtual void foo(int,double)=0;
virtual void foo(int, double, double);
第二个是新的虚函数,特定于派生的

如果您在末尾放置了一个
覆盖
,编译器将抱怨您没有覆盖任何内容。这是c++11检查

virtual void foo(int, double, double) override;

用户可以覆盖纯虚拟功能以确认是否在功能结束时使用
override
进行验证在您的情况下,只能使用派生指针或类型访问第二个函数。(尽管除非正确重写和实现纯虚拟函数,否则无法实例化它,直到它成为一个抽象类为止)。因此,如果它不打算被派生自
的类进一步覆盖,那么将其虚拟化是一种开销,因为无论如何它不会覆盖基本方法。

正如其他人所指出的,它就是不起作用

更具体地说,发生的情况如下

 Derived d;
 d.foo(5, 10.0); // Works as expected

 Base &b = d; // b is polymorphic
 b.foo(3,10,4); // foo(int, double, double) is not in class Base, hence compile-time resolution fails!

由于函数签名不同,因此它不被重写。根据重写函数的多态性规则,函数签名和类型应该相同

在这种情况下,这些功能是不同的。 虚空foo(int,double)=0;
虚空foo(int,double,double)

在基类中重载foo不是最简单的解决方案吗

class Base
{
public:
 Base();
 virtual ~Base();
 virtual void foo(int,double)=0;
 virtual void foo(int,double,double)=0;
};

函数重载表示不同的API。抽象基类表示一致的API。所以不,这没有意义。你的例子不缺少
类派生:Base
?@荒谬:对,我刚刚编辑过。谢谢,这是个问题。因此,唯一的解决方案是创建一个抽象类,而不是一个接口。不是吗?@Ale-我不明白你的意思。在C++中,<>代码>接口>代码> >代码>抽象类< /代码>有什么区别,派生类可以具有比抽象类更多的功能。相反,一个接口限制了方法的数量(在我看来)。当这个答案出现时,我正在写
override
。所以这里至少有一个链接:@Kupto:为什么在这个示例中,第一个func(double=0.0)override可以工作,而在第二个代码中它不工作?@Ale我刚刚尝试过,如果考虑到注释,第一个示例中的
override
关键字似乎是多余的。
class Base
{
public:
 Base();
 virtual ~Base();
 virtual void foo(int,double)=0;
 virtual void foo(int,double,double)=0;
};