繁体   English   中英

纯虚函数重载

[英]Overload of pure virtual function

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM