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);