纯虚函数覆盖

时间:2013-05-24 05:10:44

标签: c++

好的,我有一个愚蠢的问题,但我认为如果有办法可能会有用。

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

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

5 个答案:

答案 0 :(得分:4)

  

有办法吗?

不,如果它具有纯虚拟成员函数,则无法实例化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(); };

答案 1 :(得分:3)

这样的事情可以发挥作用:

#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();
}

答案 2 :(得分:2)

纯虚拟类无法实例化

答案 3 :(得分:2)

你最接近的是一个本地匿名类:

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

答案 4 :(得分:2)

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

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

然后如果Show!= 0你可以调用它(也就是说,如果用户为它指定了一个函数指针)。