有没有办法从子类调用父函数,但在函数内使用来自子元素而不是父元素的数据,例如。
#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个额外的函数来传递函数指针。
答案 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();
}