C++ 纯虚函数的重载
我通常使用纯虚函数来实现代码所需的方法。因此,我创建接口,然后其他用户实现其派生类。派生类只有这些虚拟函数是公共的,而一些附加方法应该实现为私有的,因为我的代码不调用它们。 我不知道这是否是OOP的一个好实践(有设计模式吗?)。 无论如何,我的问题是: 用户是否可以重载纯虚拟函数 i、 e 解决办法可以是:C++ 纯虚函数的重载,c++,oop,design-patterns,overloading,pure-virtual,C++,Oop,Design Patterns,Overloading,Pure Virtual,我通常使用纯虚函数来实现代码所需的方法。因此,我创建接口,然后其他用户实现其派生类。派生类只有这些虚拟函数是公共的,而一些附加方法应该实现为私有的,因为我的代码不调用它们。 我不知道这是否是OOP的一个好实践(有设计模式吗?)。 无论如何,我的问题是: 用户是否可以重载纯虚拟函数 i、 e 解决办法可以是: virtual void foo(int,double,double=0)=0; 在基类中,但它非常有限。你觉得怎么样 你不能 假设您有一个Base指针,指向一个派生的对象。拥有Base
virtual void foo(int,double,double=0)=0;
在基类中,但它非常有限。你觉得怎么样 你不能
假设您有一个
Base
指针,指向一个派生的
对象。拥有Base
指针,您只能“访问”Base
的界面(除非您转换为派生的指针,但这不是您需要的)。重载函数只是一个与另一个同名的函数,但接受不同的参数集,也就是说,它是一种不同的功能。它与一个或多个重载函数是否为虚拟函数无关
在您介绍的示例中,我相信用户可以重载纯虚拟函数,但只有在重写它之后。而且您无法直接从基类访问函数-您需要将基类指针强制转换为派生类指针。这两个函数不同。后者并没有凌驾于前者之上
virtual void foo(int,double)=0;
virtual void foo(int, double, double);
第二个是新的虚函数,特定于派生的
如果您在末尾放置了一个覆盖
,编译器将抱怨您没有覆盖任何内容。这是c++11检查
virtual void foo(int, double, double) override;
用户可以覆盖纯虚拟功能以确认是否在功能结束时使用override
进行验证在您的情况下,只能使用派生指针或类型访问第二个函数。(尽管除非正确重写和实现纯虚拟函数,否则无法实例化它,直到它成为一个抽象类为止)。因此,如果它不打算被派生自的类进一步覆盖,那么将其虚拟化是一种开销,因为无论如何它不会覆盖基本方法。正如其他人所指出的,它就是不起作用
更具体地说,发生的情况如下
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!
由于函数签名不同,因此它不被重写。根据重写函数的多态性规则,函数签名和类型应该相同
在这种情况下,这些功能是不同的。
虚空foo(int,double)=0;
虚空foo(int,double,double) 在基类中重载foo不是最简单的解决方案吗
class Base
{
public:
Base();
virtual ~Base();
virtual void foo(int,double)=0;
virtual void foo(int,double,double)=0;
};
函数重载表示不同的API。抽象基类表示一致的API。所以不,这没有意义。你的例子不缺少类派生:Base
?@荒谬:对,我刚刚编辑过。谢谢,这是个问题。因此,唯一的解决方案是创建一个抽象类,而不是一个接口。不是吗?@Ale-我不明白你的意思。在C++中,<>代码>接口>代码> >代码>抽象类< /代码>有什么区别,派生类可以具有比抽象类更多的功能。相反,一个接口限制了方法的数量(在我看来)。当这个答案出现时,我正在写override
。所以这里至少有一个链接:@Kupto:为什么在这个示例中,第一个func(double=0.0)override可以工作,而在第二个代码中它不工作?@Ale我刚刚尝试过,如果考虑到注释,第一个示例中的override
关键字似乎是多余的。
class Base
{
public:
Base();
virtual ~Base();
virtual void foo(int,double)=0;
virtual void foo(int,double,double)=0;
};