【发布时间】:2020-10-21 00:46:14
【问题描述】:
我有多个扩展同一个基类的派生类。它们具有相同的属性,但可能具有不同参数和主体的单个方法除外。我怎样才能有一个 std::unique_ptr 并调用派生类的方法?
这是我目前所知道的:
- 函数模板不能是
virtual; - 不能用不同的签名覆盖纯虚函数;
- 函数指针需要知道所有可能的派生函数的参数列表
这是我目前的倾向(没有成功):
基类:
class IBase
{
/** ... **/
template <class T, typename ...Args>
MyCustomType perform(T &obj, Args ... args)
{
std::bind(obj->run, args);
}
virtual MyCustomType run(...) = 0;
};
派生类:
class Derived : IBase
{
/** ... **/
virtual MyCustomType run(MyType1 a, MyType2 b, bool c) override
{
/* code */
}
};
我希望能够使用指向基类的指针,调用basePtr->perform(a, b, c) 和子类Derived 中的方法来执行。这有意义吗?
【问题讨论】:
-
Dervied实际上并没有派生自任何东西(可能只是一个错字?)。您可能必须手动编写所有重载。 -
"纯虚函数不能重载" - 不正确。函数总是可以重载的,不管它们是不是纯函数。也许你的意思是覆盖?根据定义,纯函数必须始终被覆盖。但是,您不能做的是以一种方式声明一个虚拟/纯函数,然后尝试使用不同的参数在后代中覆盖它,如您的示例所示。这是行不通的。被覆盖的函数必须与被覆盖的函数匹配相同的签名。事实上,在 C++11 中添加了
override关键字来强制执行此操作。 -
@JesperJuhl "一个纯函数可以有一个实现" - 是的,但它也必须在后代中被覆盖。这就是将
virtual方法声明为纯方法的全部意义所在。非纯virtual方法不必被覆盖,但纯virtual方法必须被覆盖。但是,如果需要,该覆盖可以调用默认实现。 -
virtualdispatch 似乎是适合这里工作的错误工具。仅给定一个IBase*,如果每个派生类的run方法具有不同的签名,您将如何调用run? -
@HenriqueSabino 在派生类中指定
virtual在覆盖基方法时是可选的。一旦方法被标记为virtual,它在所有后续后代中始终是虚拟的。
标签: c++ oop gcc polymorphism c++14