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