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