首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

什么时候形成多态解决方法

2012-09-24 
什么时候形成多态C/C++ code#include iostreamusing namespace stdclass A{public:A(int data 0){m_d

什么时候形成多态

C/C++ code
#include <iostream>using namespace std;class A{public:    A(int data = 0)    {        m_data = data;    }    int getdata()    {        return dogetdata();    }    virtual int dogetdata()    {        return m_data;    }protected:    int m_data;private:};class B: public A{public:    B(int data = 10)    {        m_data = data;    }    int dogetdata()    {        return m_data;    }protected:    int m_data;private:};int main(){    B b;    cout << b.A::getdata() << endl;    return 0;}


多态不是只有通过指针和引用实现的吗?

[解决办法]
ls的解释貌似有些误解.或者说是没有区分 getdata() 和 dogetdata() 这2个函数,所以给人的感觉很乱.

b是B的对象,b.A::getdata() 强制调用A::getdata() 的时候,的确已经进入 A::getdate() 函数了.
然后,关键是 A::getdata() 调用的是 dogetdate() 函数,而这个 dogetdata() 函数是一个虚函数,遵循虚函数表的规则,而由于本身是 B 的对象,所以虚函数表中的dogetdata()实际上是指向 B::dogetdata() 的,
所以,才回输出 B里面的数字 10 .

如果你在调用的时候,用的是 b.A::dogetdata() 强制调用A的函数,这个时候, 那么得到就是A里面的m_data,也就是 0 了.

--------

一个原则:如果调用的时候强制指定某个基类的函数,是会直接调用基类的函数而忽略虚函数表的.
但是,在基类的函数中再调用一个虚函数,那么这个新的虚函数就依然遵循虚函数表规则.

b.A::getdata() , getdata() 会忽略虚函数表的规则,但是 getdata() 里面调用的 dogetdata() 则会继续遵循虚函数表规则,所以结果就是 B::dogetdata(); 也就是返回 B::m_data
而 b.A::dogetdata() 会忽略虚函数表规则,直接返回 A::m_data .

热点排行