纯虚函数的重载
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!
由于函数签名不同,因此不会重写。根据多态规则,要覆盖函数,函数的签名和类型必须相同。
在这种情况下,这些函数是不同的。虚void foo(int,double)=0;
在基类中重载foo不是最简单的解决方案吗?
class Base
{
public:
Base();
virtual ~Base();
virtual void foo(int,double)=0;
virtual void foo(int,double,double)=0;
};
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 可以打印矢量和矢量中的矢量的非重载C++函数
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 使用模板重载函数
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 如何从重载解析中删除重载函数?
- CUDA:重载函数"isnan"的多个实例
- C++派生类重载函数(带有 std::function 参数)不可见
- 避免在人为的重载函数调用中拼写出类型
- C++:如何为多个重载函数保留通用代码路径?
- 什么时候可以使用常量装饰调用我的重载函数?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- std::调用,未找到匹配的重载函数
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 如何通过签名作为模板参数来解决重载函数?