zoukankan      html  css  js  c++  java
  • 程序基石系列之C++多态的前提条件

    准备知识

    C++中多态(polymorphism)有下面三个前提条件:

    • 必须存在一个继承体系结构.
    • 继承体系结构中的一些类必须具有同名的virtual成员函数(virtualkeyword)
    • 至少有一个基类类型的指针或基类类型的引用.这个指针或引用可用来对virtual成员函数进行调用.

    程序清单:C++中多态(运时行期绑定)

    #include <iostream>
    using namespace std;
    
    class CTradesPerson{ // base class
    	public :
    		virtual void sayHi(){ cout<<"Just hi."<<endl;}
    };
    
    class CTinker : public CTradesPerson{// drived class 1
    	public :
    		virtual void sayHi(){cout<<"Hi, I tinker."<<endl;}
    };
    
    class CTailor : public CTradesPerson{// drived class 2
    	public:
    		virtual void sayHi(){ cout<<"Hi, i tailor"<<endl;}
    };	
    	
    int main(){
    	CTradesPerson* p; // pointer to base class
    	int which ;
    	
    	// prompt user for a number
    	//*** 1 ==CTadesPerson
    	//    2 ==CTinker
    	//    3 ==CTailor
    	do{
    		cout <<"1 == CTradesPerson, 2 == CTinker, 3 == CTailor"<<endl;
    		cin >>which;
    	}while(which<1||which>3); 
    	
    	//set pointer p depending on user choice
    	switch(which){
    		case 1: p = new CTradesPerson; break;
    		case 2: p = new CTinker; break;
    		case 3: p = new CTailor; break;
    	}
    	// invoke the sayHi method via the pointer
    	p->sayHi(); // ***runt-time binding in effect
    	delete p; // *** free the dymanicall y allocated storage
    	return 0;
    }

    程序清单说明

    程序清单的程序阐明了多态及其三个前提条件:

    • 存在一个继承体系结构,CTradesPerson是基类,CTinker和CTailor是CTradesPerson的派生类.
    • 继承体系结构中有一个叫sayHi的虚成员函数,它在上述三个类中各自被定义一次,因此共同拥有三个不同的定义(但函数名同样).
    • p是个基类类型的指针.在本程序清单中p的数据类型是CTradesPerson*. 指针p用来实施对虚成员函数sayHi的调用.

    測试数据

    在该程序的某次执行过程中,我们输入数据1,就会得到例如以下结果:


    当我们输入数据3, 就会得到例如以下结果:



    关于Program Language很多其它讨论与交流。敬请关注本博客和新浪微博songzi_tea.

  • 相关阅读:
    [leetcode]49. Group Anagrams变位词归类
    [leetcode]40. Combination Sum II组合之和(每元素限用一次)
    [leetcode]39. Combination Sum组合之和
    [leetcode]35. Search Insert Position寻找插入位置
    [leetcode]28. Implement strStr()实现strStr()
    [leetcode]25. Reverse Nodes in k-Group每k个节点反转一下
    [leetcode]24. Swap Nodes in Pairs交换节点对
    SVG基础知识 Adobe Illustrator绘制SVG
    Java静态方法和实例方法 java中的数组作为形参传入
    SVG可伸缩的矢量图形
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6895924.html
Copyright © 2011-2022 走看看