2014-09-01 73 views
0

是否有任何方法可以從子類中調用父函數,但在函數中使用來自子代的數據而不是父代,例如。使用具有繼承類值的基類函數

#include <stdio.h> 

class Base{ 

public: 
    int i=10; 

    virtual void print(){ 
     printf("%i", i); 
    } 

}; 


class Derived : public Base { 

public: 
    int i = 20; 

    void print(){ 
     Base::print(); 
    } 

}; 

int main(){ 

    Derived I; 
    I.print();  

} 

所以我想這打印20而不是10基本上。

編輯::::::::::::

什麼我其實想做的是使用一個基類,它定義多種功能

virtual int OnExecute(); 

    virtual bool OnInit(); 

    virtual void OnEvent(SDL_Event* Event); 

    virtual void OnLoop(); 

    virtual void OnRender(); 

    virtual void OnCleanUp(); 

然後有一個派生類重載所有的這些功能exept OnExectue(),它看起來像這樣

if (OnInit() == 0){ 
    return -1; 
    } 

    SDL_Event Event; 
    while (isRunning){ 
      while (SDL_PollEvent(&Event)){ 
        OnEvent(&Event); 
      } 
      OnLoop(); 
      OnRender(); 
    } 

OnCleanUp(); 

那麼,有沒有在那裏我不會無需定義5個額外的功能來傳遞函數指針更簡單的方式。

回答

1

你需要dynamic_cast的,就像這樣:

#include <iostream> 
#include <stdio.h> 

class Derived; 

class Base{ 
    public: 
    int i=10; 

    virtual void print(); 
}; 

class Derived : public Base { 
public: 
    int i = 20; 
    void print(){ 
     Base::print(); 
    } 

}; 

void Base::print(){ 
    Derived* p = dynamic_cast<Derived*>(this);                                
    if(p) { 
     //derived 
     printf("%i\n", p->i); 
    }else{ 
     //base 
     printf("%i\n", i); 
    } 
} 

int main(){ 

    Derived I; 
    I.print();  

} 
+0

這不會使Base :: print()不能用於Base對象嗎? – PhobicHD 2014-09-01 02:30:29

+0

只是模式打印,已經更新。 – 2014-09-01 02:36:22

2

如果您通過虛擬成員函數提供對數據的訪問,則可以執行此操作。

#include <stdio.h> 

class Base{ 

public: 
    int i=10; 

    virtual void print(){ 
     printf("%i", this->getI()); 
    } 

    virtual int getI() 
    { 
     return i; 
    } 

}; 


class Derived : public Base { 

public: 
    int i = 20; 

    void print(){ 
     Base::print(); 
    } 

    virtual int getI() 
    { 
     return i; 
    } 
}; 

int main(){ 

    Derived I; 
    I.print();  

} 
+0

我沒有看到執行'派生::打印點()'只叫'基地::打印()'。 – 2014-09-01 02:12:35

+0

您可能需要在'Derived :: print()'中打印更多數據。 – 2014-09-01 02:13:31