[英]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.