簡體   English   中英

虛函數綁定

[英]Virtual function binding

大家好,有一個關於虛函數綁定的問題,不知道是否有這樣的事情,所以我想問一下。 在此處輸入圖片說明

所以我有一個游戲狀態機。 GameState類是所有狀態實體的主要類,GameStateFirstPhase僅是其他3個類(StartUp,SelectServer,ConnectServer)的實體類。

因此,我想做的是拆分一個draw函數並在GameStateFirstPhase類中繪制這3個類的所有實體,並且這3個類對於僅適用於該類的特定事物具有自己的draw函數,例如GameStateSelectServer類將具有繪制UI選擇服務器面板+所有類的實體,即GameStateFirstPhase類。

這就是我想將CurrentState繪制函數與GameStateFirstPhase Draw函數綁定的方式:我的游戲對象有一個指向CurrentState的指針,並將其稱為CurrentState Draw函數。

我試圖像這樣在CurrentState Draw函數中調用Entity類的draw函數:

GameStateFirstPhase::Draw(gfx); 

但是我認為這樣做是非法的。 我希望你能明白我的意思,這是有道理的。 我也給我解釋一切的形象。

問題是,是否有可能將GameStateFirstPhase Draw函數與這些狀態之一綁定Draw函數(StartUp,SelectServer,ConnectSeerver狀態)bind我的意思是要獲得該父行為並添加子繪制

“ ...綁定,我的意思是得到父母的行為,並添加孩子繪畫。”

如果您四處詢問多態性,則“綁定”不是可用的術語。 研究“虛擬”,這是一種方法的修飾符。

不,調用派生的foo()時不會涉及基類(父)行為(稱為“ foo()”)。 從方法調用序列的意義上講,派生的foo()不會“添加”到父foo()中。

但是,派生的foo()可以在其執行的任何時候調用基本foo()。


更新-添加小示例庫/派生/使用虛擬

#include <iostream>
#include <vector>


 // base class
 class Foo
 {
 public:
    Foo() { std::cout << "Foo::Foo() " << std::endl; }

    virtual
    ~Foo() { std::cout << "Foo::~Foo() " << std::endl; }

    virtual void foo();
 };

 class Bar : public Foo
 {
 public:
    Bar() : Foo()
       { std::cout << "Bar::Bar() " << std::endl; }

    virtual
    ~Bar() { std::cout << "Bar::~Bar() " << std::endl; }

    virtual void foo();
 };

 void Foo::foo()  // virtual method
 {
    std::cout << " -- foo() in Foo " << std::endl;
 }

 void Bar::foo()  // also virtual method
 {
    Foo::foo();
    std::cout << " -- foo() in Bar " << std::endl;
    Foo::foo();
    std::cout << " -- foo() in Bar " << std::endl;
    Foo::foo();
 }


int testFoo(void)  // invoke from main
{
   std::cout << "\nsizeof(Foo): " << sizeof(Foo) << std::endl;
   std::cout << "sizeof(Foo*): " << sizeof(Foo*) << std::endl;

   std::cout << "\n";
   Foo* f = new Foo();   // ctor Foo one time

   std::cout << "\n";
   Bar* b = new Bar();   // ctor Foo + ctor Bar

   std::cout << "\n-----------------\n";
   f->foo();             // foo() in Foo

   std::cout << "\n";
   b->foo();             // foo() in xxx (5 lines)
   std::cout << "\n-----------------";

   // create a polymorphic vector
   std::vector<Foo*> fooVec;

   fooVec.push_back(f);  // Foo* added
   fooVec.push_back(b);  // Bar* added - accepted because "is-a" Foo
   // maybe 100's of different derived methods, added in arbitrary order

   for (auto x : fooVec )  // invoke foo() on ALL elements
   {
      std::cout << "\n";
      x->foo();
   }

   return(0);
}

輸出

sizeof(Foo): 8
sizeof(Foo*): 8

Foo::Foo() 

Foo::Foo() 
Bar::Bar() 

----------------- 
 -- foo() in Foo 

 -- foo() in Foo 
 -- foo() in Bar 
 -- foo() in Foo 
 -- foo() in Bar 
 -- foo() in Foo 

-----------------
 -- foo() in Foo 

 -- foo() in Foo 
 -- foo() in Bar 
 -- foo() in Foo 
 -- foo() in Bar 
 -- foo() in Foo 

抱歉,這太瑣碎了……我希望它能幫助您進入虛擬,純虛擬等方面的研究。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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