[英]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 world\n";
}
} f;
f.Show();
}
您可以在類中存儲名為show的函數指針。
class Foo
{
public:
void (*Show)();
Foo()
{
Show = 0;
}
}
然后,如果Show!= 0,你可以調用它(也就是說,如果用戶為它指定了一個函數指針)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.