6

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

IE

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;

在基类中,但非常有限。你有什么想法?

4

6 回答 6

10

这2个功能是不同的。后者不会覆盖第一个

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

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

如果你把 aoverride放在最后,编译会抱怨你没有覆盖任何东西。这是 c++11 检查。

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

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

于 2013-04-05T07:02:01.297 回答
4

你不能。

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

于 2013-04-05T06:55:38.153 回答
3

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

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

于 2013-04-05T06:58:09.003 回答
0

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

更离散的是,这就是发生的事情

 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!
于 2013-04-05T07:04:21.593 回答
0

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

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

于 2014-02-13T11:36:57.430 回答
0

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

class Base
{
public:
 Base();
 virtual ~Base();
 virtual void foo(int,double)=0;
 virtual void foo(int,double,double)=0;
};
于 2015-05-10T11:47:54.310 回答