簡體   English   中英

純虛函數覆蓋

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM