纯虚函数重载

时间:2013-04-05 06:52:43

标签: c++ oop design-patterns overloading pure-virtual

我通常使用纯虚函数来处理我的代码所需的那些方法。因此,我创建接口,然后其他用户实现其派生类。派生类只将这些虚函数作为公共函数,而一些其他方法应该作为私有实现,因为我的代码不会调用它们。 我不知道这是否可以被认为是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;
基类中的

但它非常有限。你有什么想法?

6 个答案:

答案 0 :(得分:9)

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

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

第二个是特定于派生的新虚拟功能。

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

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

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

答案 1 :(得分:4)

你做不到。

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

答案 2 :(得分:3)

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

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

答案 3 :(得分: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!

答案 4 :(得分:0)

由于功能签名不同,因此不会覆盖。根据覆盖函数的多态性规则,函数签名和类型应该相同。

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

答案 5 :(得分:0)

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

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