纯虚函数的重载

Overload of pure virtual function

本文关键字:重载 函数      更新时间:2023-10-16

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

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

一个解决方案可以是:

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

在基类中,但它非常有限。你是怎么想的?

这两个函数是不同的。后者不覆盖第一个

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

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

如果你把一个override放在末尾,编译器会抱怨你没有覆盖任何东西。这是c++11的检查

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

用户可以覆盖一个纯虚函数来确认,使用函数末尾的override来验证。在您的例子中,第二个函数只能使用派生指针或类型访问。(尽管它不能被实例化,除非纯虚函数被正确重写和实现,在此之前它是一个抽象类)。因此,如果它不打算被从Derived派生的类进一步覆盖,那么使它成为虚拟是一个开销,因为它无论如何都不会覆盖基方法。

你不能。

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

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

在您提供的示例中,我认为用户可以重载纯虚函数,但只能在重写它之后。而且您不能直接从基类访问函数—您需要将基类指针强制转换为派生类指针。

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

更具体地说,下面是

 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!

由于函数签名不同,因此不会重写。根据多态规则,要覆盖函数,函数的签名和类型必须相同。

在这种情况下,这些函数是不同的。虚void foo(int,double)=0;

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

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