c++ - 纯虚函数覆盖

标签 c++

好吧,我有一个有点愚蠢的问题,但我认为如果有办法做到这一点,它可能会有用。

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

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

最佳答案

Is there a way to do that?

不,你不能实例化Foo如果它有一个纯虚成员函数。

I just have to know if that or something similar can be done.

这取决于你所说的相似是什么意思。如果忘记纯虚的话可以给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(); };

关于c++ - 纯虚函数覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16728037/

相关文章:

c++ - 在我的项目中使用预编译头文件(clang/llvm,但也包括 gcc)。如何在 make 中部署 -include 选项?

c++ - 在 C++ 中使用 wmemset

c++ - 获取 clang 格式以将多行函数调用的右括号放在单独的行上?

c++ - 矩阵和变换可以互换吗?

c++ - 无法初始化成员初始化列表中的对象

c++ - 我想编写一个遍历列表的函数?

c++ - 如何从 vector <char>中提取不同数据类型的子 vector ?

模板类中模板函数的 C++ 特化

c++ - Protobuf 版本与 Qt 冲突

python - 通过引用返回 vector<string>