子类对象强行调用父类虚函数。

tangcat123 tangcat123 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
class A

{

protected:

int m_data;

public:

A(int data = 0){ m_data = data; }

int GetData(){ return doGetData();}

virtual int doGetData(){ return m_data;/*m_data =0 */}

};



class B:public A

{

protected:

int m_data;

public:

B(int data = 1){ m_data = data; }

//这里A 中的m_data = 0 ,B中的m_data = 1



int doGetData(){ return m_data ;/*m_data =1 */} //实现接口

};



class C:public B

//C继承了A&B类的方法&属性,且未从新定义接口,故接口还是B类中定义的

{

protected:

int m_data;

public:

C(int data = 2){ m_data = data; }

//这里A 中的m_data = 0 ,B中的m_data = 1,C 类中的m_data = 2

};



int main()

{

C c( 10);

cout<< c.GetData()<< endl; //输出为:1

cout<< c.A::GetData()<< endl;//输出为:1

cout<< c.B::GetData()<< endl; //输出为:1

cout<< c.C::GetData()<< endl; //输出为:1



cout<< c.doGetData()<< endl; //输出为:1

cout<< c.A::doGetData()<< endl; //输出为:0

cout<< c.B::doGetData()<< endl; //输出为:1

cout<< c.C::doGetData()<< endl; //输出为:1



system("pause");

return 0;

}


这里我有点迷惑
c.A::doGetData()
c对象的内存布局中他的虚函数表里是没有A的doGetData这个虚函数的啊
如果强行去找对应A的doGetData,他是怎么找到的?
还有就是 c.A::GetData()和c.A::doGetData()最终不都相当于A类指针指向C类对象么,答案不应该都是1么。
迷惑
...全文

相关推荐

评论 5
收藏 已收藏
分享
返回顶部
tangcat123
C++ 语言 65,214 成员 250,514 内容