关于c ++:纯虚函数的重载

Overload of pure virtual function

我通常使用纯虚拟函数来处理代码所要求的那些方法,以使其工作良好。因此,我创建接口,然后其他用户实现其派生类。派生类只有这些作为公共的虚拟函数,而一些额外的方法应该作为私有的实现,因为我的代码不调用它们。我不知道这是否可以被视为OOP的一个良好实践(是否有任何设计模式?).不管怎样,我的问题是:用户是否可以重载纯虚拟函数?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Base
{
public:
 Base();
 virtual ~Base();
 virtual void foo(int,double)=0;
};

class Derived:
public Base
{
 private:
  // methods
 public:
 Derived();
 virtual ~Derived();
 virtual void foo(int, double, double); //this doesn't work
 };

解决方案可能是:

1
 virtual void foo(int,double,double=0)=0;

但它是非常有限的。你觉得怎么样?


这两种功能不同。后者并不凌驾于前者

1
2
virtual void foo(int,double)=0;
virtual void foo(int, double, double);

第二个是派生的新的虚函数。

如果在末尾放一个override,编译将抱怨没有覆盖任何内容。这是C++ 11的检查。

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

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


你不能。

假设有一个Base指针指向一个Derived对象。使用Base指针,您只能"访问"Base的接口(除非您强制转换为Derived指针,但这不是您需要的)。


重载函数只是一个与另一个同名的函数,但接受一组不同的参数,即它是一个不同的函数。它与一个或多个重载函数是否为虚拟函数无关。

在您给出的示例中,我相信用户可以重载纯虚拟函数,但必须在重写它之后。您不能直接从基类访问函数-您需要将基类指针强制转换为派生类指针。


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

1
2
3
4
5
6
7
8
class Base
{
public:
 Base();
 virtual ~Base();
 virtual void foo(int,double)=0;
 virtual void foo(int,double,double)=0;
};

它不会被重写,因为函数签名是不同的。根据多态性规则来重写函数,函数签名和类型应该是相同的。

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


正如其他人所指出的,这是行不通的。

更谨慎地说,这就是发生的事情

1
2
3
4
5
 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!