Overload of pure virtual function
我通常使用纯虚拟函数来处理代码所要求的那些方法,以使其工作良好。因此,我创建接口,然后其他用户实现其派生类。派生类只有这些作为公共的虚拟函数,而一些额外的方法应该作为私有的实现,因为我的代码不调用它们。我不知道这是否可以被视为OOP的一个良好实践(是否有任何设计模式?).不管怎样,我的问题是:用户是否可以重载纯虚拟函数?
即
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 }; |
解决方案可能是:
1 | virtual void foo(int,double,double=0)=0; |
但它是非常有限的。你觉得怎么样?
这两种功能不同。后者并不凌驾于前者
1 2 | virtual void foo(int,double)=0; virtual void foo(int, double, double); |
第二个是派生的新的虚函数。
如果在末尾放一个
1 | virtual void foo(int, double, double) override; |
用户可以覆盖一个纯虚拟函数,以确认在函数结束时使用
你不能。
假设有一个
重载函数只是一个与另一个同名的函数,但接受一组不同的参数,即它是一个不同的函数。它与一个或多个重载函数是否为虚拟函数无关。
在您给出的示例中,我相信用户可以重载纯虚拟函数,但必须在重写它之后。您不能直接从基类访问函数-您需要将基类指针强制转换为派生类指针。
重载基类中的foo不是最简单的解决方案吗?
1 2 3 4 5 6 7 8 | class Base { public: Base(); virtual ~Base(); virtual void foo(int,double)=0; virtual void foo(int,double,double)=0; }; |
它不会被重写,因为函数签名是不同的。根据多态性规则来重写函数,函数签名和类型应该是相同的。
在这种情况下,这些功能是不同的。虚空foo(int,double)=0;虚虚虚foo(int,double,double);
正如其他人所指出的,这是行不通的。
更谨慎地说,这就是发生的事情
1 2 3 4 5 | 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! |