使用具有继承类值的基类'函数

时间:2014-09-01 01:58:24

标签: c++ inheritance

有没有办法从子类调用父函数,但在函数内使用来自子元素而不是父元素的数据,例如。

#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个额外的函数来传递函数指针。

2 个答案:

答案 0 :(得分: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();    

}

答案 1 :(得分: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();    

}