什么时候形成多态
- 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 .