转载自:http://c.biancheng.net/view/2294.html
1.通过基类指针只能访问派生类成员变量但不能访问派生类的成员函数。
例如:
1 #include "pch.h" 2 #include <iostream> 3 4 using namespace std; 5 6 class M { 7 public: 8 void display(); 9 M(int i,int j); 10 11 protected: 12 int m_i, m_j; 13 }; 14 15 M::M(int i, int j) :m_i(i), m_j(j) {} 16 17 void M::display() { 18 cout << m_i << " " << m_j << " " << "old" << endl; 19 } 20 21 class N : public M { 22 public: 23 void display(); 24 N(int x, int y,int z); 25 26 private: 27 int m_x, m_y, m_z; 28 }; 29 30 N::N(int x, int y,int z):M(x,y),m_z(z) {}; 31 32 void N::display() { 33 cout << m_i <<" "<< m_j <<" "<< m_z << " " << "new" <<endl; 34 } 35 36 int main() 37 { 38 M *p = new M(1, 2); 39 p->display(); 40 p = new N(3, 4, 5); 41 p->display(); 42 43 return 0; 44 }
此处 p 调用的display()始终是M的成员函数,并未调用N。
解决这个问题只需在display函数(基类)前加 virtual 将其声明为虚函数即可:
1 #include "pch.h" 2 #include <iostream> 3 4 using namespace std; 5 6 class M { 7 public: 8 virtual void display(); 9 M(int i,int j); 10 11 protected: 12 int m_i, m_j; 13 }; 14 15 M::M(int i, int j) :m_i(i), m_j(j) {} 16 17 void M::display() { 18 cout << m_i << " " << m_j << " " << "old" << endl; 19 } 20 21 class N : public M { 22 public: 23 void display(); 24 N(int x, int y,int z); 25 26 private: 27 int m_z; 28 }; 29 30 N::N(int x, int y,int z):M(x,y),m_z(z) {}; 31 32 void N::display() { 33 cout << m_i <<" "<< m_j <<" "<< m_z << " " << "new" <<endl; 34 } 35 36 int main() 37 { 38 M *p = new M(1, 2); 39 p->display(); 40 p = new N(3, 4, 5); 41 p->display(); 42 43 return 0; 44 }
运行结果:
有了虚函数,基类指针指向基类对象时就使用基类的成员(包括成员函数和成员变量),指向派生类对象时就使用派生类的成员。换句话说,基类指针可以按照基类的方式来做事,也可以按照派生类的方式来做事,它有多种形态,或者说有多种表现方式,我们将这种现象称为多态(Polymorphism)。
C++提供多态的目的是:可以通过基类指针对所有派生类(包括直接派生和间接派生)的成员变量和成员函数进行“全方位”的访问,尤其是成员函数。如果没有多态,我们只能访问成员变量。
上面的代码中,同样是p->display();
这条语句,当 p 指向不同的对象时,它执行的操作是不一样的。同一条语句可以执行不同的操作,看起来有不同表现方式,这就是多态。
2.引用也可以实现多态,将主函数里面改成:
M m(1, 2); N n(3, 4, 5); M &rm = m; M &rn = n; rm.display(); rn.display();
结果跟上面一致。
不过引用不像指针灵活,指针可以随时改变指向,而引用只能指代固定的对象,在多态性方面缺乏表现力。
原文链接: https://www.cnblogs.com/ArrowToLanguage/p/12322822.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/329967
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!