纯虚拟功能覆盖

Pure Virtual function override

本文关键字:覆盖 功能 虚拟      更新时间:2023-10-16

好的,所以我有一个有点傻的问题,但我认为如果有办法的话,这可能会很有用。

无论如何,假设我有以下类:

class Foo
{
    public:
        virtual void Show() = 0;
};

如果我想在不犯错误的情况下使用Foo怎么办?有没有一种方法可以简单地完成以下操作(而不是创建一个全新的类来实现Show(:

Foo F;
F.Show = [&]{/*Do something here*/}; //Assign some function or Lambda to Foo instance F

有办法做到这一点吗?我知道这看起来很傻,但我只想知道是否可以这样做或类似的事情。

它显然不能编译:l

有办法做到这一点吗?

不,如果Foo具有纯虚拟成员函数,则不能实例化它。

我只是想知道是否可以这样做或类似的事情。

这取决于你所说的相似是什么意思。如果您忘记了纯虚拟,您可以给Foo::Show()一个实现,比如说std::function<void()>,您可以从lambda表达式、另一个std::function<void()>或任何具有该签名和返回类型的可调用实体中设置它。

#include <functional>
class Foo
{
 public:
  virtual void Show() { fun(); }
  std::function<void()> fun;
};

然后

#include <iostream>
int main()
{
  Foo f;
  f.fun = []{std::cout << "Hello, World!";};
  f.Show();
}

注意正如@MrUniverse的评论中所建议的,在调用函数之前,您应该检查该函数是否已被初始化。这很容易做到:

virtual void Show() { if (fun) fun(); };

类似的东西可以工作:

#include <functional>
#include <iostream>
class Foo
{
public:
  std::function<void(void)> Show;
};
int main()
{
  Foo f;
  f.Show = [&] () { std::cout << "Hello !" << std::endl; };
  f.Show();
}

纯虚拟类不能在所有上实例化

最接近的是本地匿名类:

#include <iostream>
class Foo
{
    public:
        virtual void Show() = 0;
};
int main() {
    struct : Foo {
        void Show() {
            std::cout << "Hello worldn";
        }
    } f;
    f.Show();
}

您可以在类中存储一个名为show的函数指针。

class Foo
{
    public:
        void (*Show)();
        Foo()
        {
            Show = 0;
        }
}

如果显示!=0,您可以调用它(也就是说,如果用户为它分配了一个函数指针(。