纯虚拟功能覆盖
Pure Virtual function override
好的,所以我有一个有点傻的问题,但我认为如果有办法的话,这可能会很有用。
无论如何,假设我有以下类:
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,您可以调用它(也就是说,如果用户为它分配了一个函数指针(。
相关文章:
- C++中"覆盖功能的异常规范比基本版本更宽松"的奇怪错误
- 矢量被push_back功能覆盖
- 为什么我无法覆盖虚拟功能?
- 是否可以在 C++03 中实现类似"覆盖"的功能
- 覆盖私有功能,它与受保护功能有何不同?
- 带有抽象类的覆盖模板功能
- 覆盖私人功能
- C++继承 - 覆盖功能,包括使用 "::" s、.h 文件和.cpp文件
- C++向下转换以撤消功能覆盖
- 每个实例C 的覆盖功能
- SVML的覆盖功能调用
- 如何在标题文件中获取成员功能的正确代码覆盖范围
- C 从同一基本模板类覆盖功能,具有多个继承模棱两可的函数调用
- 是否有可能覆盖全局实现的功能
- 覆盖功能的异常规范比基本版本更宽松
- 与基类不同的返回类型的C 覆盖功能
- C++中的覆盖功能
- C++覆盖功能
- 构建和使用包含覆盖功能的pnacl-compiler-rt
- 纯虚拟和覆盖功能(c++)