基类指针怎么访问派生类的成员函数呢(新增的)?而且这样访问为什么是错的。

#include
using namespace std;
class Base
{
public:
virtual void printBase(){}
private:
int bval;
};
class Derived:public Base{
public:
virtual void printDerived() {}
private:
int dval;
};
void main(){
Derived derived1,derived2;
Base *ptb=&derived1;
ptb->printDerived();//没有成员函数printDerived1
ptb->printBase();
Base &rfb=derived2;
rfb.printDerived();//这个也是,
rfb.printBase();
}

2个回答

你的Base类中就没有printDerived() 函数,当然无法使用基类指针指向派生类的成员函数。虚函数是使用虚函数表实现的,派生类中的函数要覆盖并实现基类的
虚函数,从而替换基类的虚函数表中的函数指针。

grapple_Eisen
grapple_Eisen 那有访问的方法吗?
接近 4 年之前 回复

我刚开始学c++,基类想访问派生类的成员函数不是只能够通过虚函数实现的多态来进行访问吗?不过你说的“新增”是什么意思?c++新增的功能吗?

qq_33934460
Mr Jason 这是我猜的,我也不是很清楚,不过应该是这样,除此之外,我再想不到其他合理的解释了。
接近 4 年之前 回复
qq_33934460
Mr Jason 强行访问我觉得算是c++的一个bug吧。正常来说,每个对象都是独立的,当使用基类指针去调用非虚函数时,编译器应该只会查找基类的函数块。而当调用虚函数时,对于基类指针来说,系统应该只会跳转到基类的虚表中去查找函数吧。并且此时基类的虚表里是没有派生类新增的虚函数的。
接近 4 年之前 回复
grapple_Eisen
grapple_Eisen 回复Mr Jason: 嗯,是 可以强行访问的,但是比较疑惑的是这个代码中,有Base *ptb=&derived1;是基类的指针指向了派生类的对象了的啊,
接近 4 年之前 回复
qq_33934460
Mr Jason 你可以通过指针进行强行访问
接近 4 年之前 回复
grapple_Eisen
grapple_Eisen 我知道的一个是如果基类和派生类有同名同参的成员函数时,是可以通过虚函数访问的,,但是派生类有自己的函数,也就是新增的,怎么访问啊?
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐