一个向上转型的指针强制向下转型

场景描述:实例化子类,然后将地址传递给父类的指针,父类的指针在得到子类的实例地址之后,重新强制转化成子类的指针,通过static_cast成功实现了转型。

class CFather{
public:
    void Display()
    {
        cout<<"Father display"<<endl;
    }
};

class CSon:public CFather
{
public:
     void Display()
    {
        cout<<"Son dispaly"<<endl;
    }
};
      CFather* p=new CSon;     
      p->Display();//调用的是父类的函数 Father Display
      

      CSon* pCSon=static_cast<CSon*>(p);
      pCSon->Display(); //调用的是子类的函数 Son Display


      if(NULL!=p)
      {
          delete p;
          p=NULL;
      }

如下的细节需要注意的:

static_cast<CSon*>(p)

中p的括号不可少:提示错误:expected '(' before 'p'

中的CSon*的星号不可缺,指明强制转换指针,提示错误:

no matching function for call to 'CSon::CSon(CFather*&)'

从这个例子我们可以看出:编译器为类自动生成了拷贝构造函数,否则我们是无法实现向下转型的。

你可能感兴趣的:(父类,子类,向上转型,向下转型)