C++中性子クラスと親クラス間の相互変換

4640 ワード

// EX_EXAM.cpp :              。  
//  
#include "stdafx.h"  
#include   
using namespace std;  

class A  
{  
public:  
    virtual void foo() { cout<<"A foo"<void pp() { cout<<"A pp"<class B: public A  
{  
public:  
    void foo() { cout<<"B foo"<void pp() { cout<<"B pp"<void FunctionB() { cout<<"Excute FunctionB!"<int _tmain(int argc, _TCHAR* argv[])  
{  
    A a;  
    B b;  
    A *pa=&b;  
    pa->foo();  
    pa->pp();  
    if (B *pb=dynamic_cast(pa))  
    {  
        cout<<"Convert from B to A successfully"<dynamic_cast(pa))->FunctionB();  
        (dynamic_cast(pa))->foo();  
        (dynamic_cast(pa))->pp();  
        (*pa).foo();  
    }  
    else  
        cout<<"Cannot convert from B to A"<return 0;  
}  
class Base{
public:
    int a;
    Base()
   {
     a=15;
   }
   virtual void test(){}

   void write(){}

   };

class Derived:public Base{
  public :
  Derived()
  {
   a=19;
  }
  void test(){
   cout<<"xiao go
"
<void test1(){ } void write(){ cout<"write"<

次の変換はエラーです.
Base *base = new Base

Derived*derive = new  Derived

base=derive;

正しい変換は次のとおりです.
Base *base  = new  Derived

baseは親クラスで定義されたすべてのメソッドを実装し、虚関数であればサブクラスの実装を行います.
例えばtest()が虚関数
base.test実行結果xiao go 19
実行中にBASEのコンストラクタが呼び出され、その後Derivedのコンストラクタが呼び出されるため、ここでaは19でbaseに単独でアクセスする.a結果は依然として19
baseという変数では、サブクラスを実行できる虚関数と構造関数を除いて、base->test 1()では実行できないなどの他のサブクラス関数は実行できません.
親が子に変換
     ,         ,        :

    Base *base = new Base()

    Dervie *derive =  Base *base;

               ,           ,                ,      

の関数は、deriveで呼び出すことができます.
メモ:
    (  :virtual ReturnType Function()= 0;)          ,        

すべて実現してから、このクラスは具体化することができます.
C++は、コンパイル時の多態性、実行時の多態性の2つの多態性をサポートします.a.コンパイル時の多態性:リロード関数と演算子のリロードによって実現する.b実行時の多態性:虚関数と継承によって実現される.
Base * pB1 = new Base; Base * pB2 = new Derived; 子から親への自動タイプがアップグレードされます.の強く回す必要はありません.の
Base *A =new Derived; //Derived->Base.

親から子への強制型変換
Derived * D1 = dynamic_cast (pB1);