2016-11-18 62 views
-1

你好家伙有一个虚拟函数绑定的问题不知道是否有这样的事情,所以我想问一下。 enter image description here虚拟函数绑定

所以我有一个游戏状态机。 GameState类是所有状态实体的主类,GameStateFirstPhase是仅针对其他3个类(StartUp,SelectServer,ConnectServer)的实体类。

那么我想要做的是分裂一个绘制函数,并在GameStateFirstPhase类中绘制这三个类的所有实体,而这三个类只有针对该类的特定事物的绘图函数,比如GameStateSelectServer类必须绘制一个UI Select服务器面板+所有类为GameStateFirstPhase类的实体。

这就是我想如何将GameStateFirstPhase Draw函数与CurrentState绘图函数绑定:我的游戏对象有一个指向CurrentState的指针并将其称为CurrentState Draw函数。

我试图打电话内CurrentState一个实体类绘制函数绘制函数是这样的:

GameStateFirstPhase::Draw(gfx); 

,但我认为这是违法的事情。我希望你能得到我想要做的事情,这很有道理。我也给我解释一切的图像。

的问题是,如果有可能绑定GameStateFirstPhase绘图功能与这些国家的一个绘图功能(启动,SelectServer,ConnectSeerver状态)绑定我的意思来获取父母的行为,并添加一个孩子画以及

+4

伟大的 - 在深蓝色的黑色 - 非常可读 –

+0

对不起,但fon t尺寸大还是没那么差 – yahoo5000

+1

“loadgin”? “Ingerit”? “Funtion”? – melpomene

回答

2

“...绑定我的意思是让父母的行为,并添加一个儿童画。”

如果你想知道多态性,'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 

很抱歉,这是那么微不足道...我的希望是,它可以帮助你引导进入虚拟,纯虚拟的研究等。

+0

你能告诉这个喜欢noob吗?我的意思是如果我得到这个权利,所以我不能获得父类绘制函数的行为,并将其追加到子类的绘制函数,即使我会调用GameStateFirstPhase :: Draw(gfx);在一个孩子班里面? – yahoo5000

+0

@ yahoo5000否 - 您无法获得“父类绘制函数行为并将其附加到子类绘制函数”。但是您可以将子类的绘制方法行为添加到基类的绘制行为中。派生方法可以使用基类的所有公共方法。 –

+0

我只是可能不知道如何提出问题,但这个示例显示了我需要的所有东西 – yahoo5000