• RTTI之dynamic_cast运算符


    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    
    using std::cout;
    class Grand
    {
    	private:
    		int hold;
    	public:
    		Grand(int h=0):hold(h){}
    		virtual void Speak() const {cout << "I am a grand class!
    ";}
    		virtual int Value() const {return hold;}
    };
    
    class Superb:public Grand
    {
    	public:
    		Superb(int h=0):Grand(h){}
    		void Speak() const {cout << "I am a superb class!
    ";}
    		virtual void Say() const
    		{
    			cout << "I hold the superb value of " << Value() << "!
    ";
    		}
    };
    
    class Magnificent:public Superb
    {
    	private:
    		char ch;
    	public:
    		Magnificent(int h=0, char c='A') : Superb(h),ch(c){}
    		void Speak() const {cout << "I am a magnificent class!!!
    ";}
    		void Say() const {cout << "I hold the character " << ch << " and th e integer " << Value() << "!
    ";}
    };
    
    Grand * Getone();
    
    int main()
    {
    	std::srand(std::time(0));
    	Grand * pg;
    	Superb * ps;
    	for(int i=0;i<5;i++)
    	{
    		pg=Getone();
    		pg->Speak();
    		if(ps=dynamic_cast<Superb *>(pg))
    			ps->Say();
    	}
    	return 0;
    }
    
    Grand * Getone()
    {
    	Grand * p;
    	switch(std::rand()%3)
    	{
    		case 0: p=new Grand(std::rand()%100);
    				break;
    		case 1:p=new Superb(std::rand()%100);
    			   break;
    		case 2:p=new Magnificent(std::rand()%100,'A'+std::rand()%26);
    			   break;
    	}
    	return p;
    }
    

      

    Superb * pm=dynamic_cast<Superb *>(pg)提出了这样的问题:指针pg的类型是否可被安全地转换为Superb *?如果可以,运算符将返回对象的地址,否则返回一个空指针。

  • 相关阅读:
    Python3 collections模块的使用
    基于python的分治法和例题
    docker容器间通信 (共用宿主机)
    HTML之form表单ENCTYPE属性解析
    搭建基于码云gitee平台代码自动部署
    centos7下docker搭建nginx+phpfpm环境
    mysql主从配置
    centos7升级自带mariadb
    linux下安装docker
    centos7安装postgreSql11
  • 原文地址:https://www.cnblogs.com/lakeone/p/3856366.html
Copyright © 2020-2023  润新知