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