當(dāng)將一個(gè)派生類(lèi)強(qiáng)制轉(zhuǎn)換成基類(lèi)類(lèi)型的時(shí)候,轉(zhuǎn)換方式不一樣會(huì)產(chǎn)生不一樣的效果。例如該代碼:static_cast<base&>(*this) ;
base 是基類(lèi),這句代碼是將當(dāng)前對(duì)象強(qiáng)制轉(zhuǎn)化為積累類(lèi)型的對(duì)象的引用,這樣的話不會(huì)再次調(diào)用基類(lèi)的構(gòu)造函數(shù)。若轉(zhuǎn)換成基類(lèi)對(duì)象那就要調(diào)用基類(lèi)的構(gòu)造函數(shù)并創(chuàng)建出新的對(duì)象來(lái)了。
完整的代碼:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <iostream>
#include <cstdlib>
#include "stdio.h"
#include <string>
#include <iostream>
using namespace std;
class A
{
public:
A():i_(0)
{
i_++;
cout << " A::A() is Exce." << endl;
}
A(int i) : i_(i)
{
i_++;
}
virtual ~A()
{
i_--;
cout << " A::~A() is Exce." << endl;
}
public:
int i_;
};
class B : public A
{
public:
B():j_(0)
{
j_++;
cout << " B::B() is Exce." << endl;
}
B(int j) : A(j) , j_(j)
{
j_++;
}
~B()
{
j_--;
cout << " B::~B() is Exce." << endl;
}
public:
int j_;
};
int main(int argc, char *argv[])
{
B *b1 = new B(5);
B *b2 = new B(8);
cout << "before changer " << endl;
cout << "b1.i_ = " << b1->i_ << endl;
cout << "b1.j_ = " << b1->j_ << endl;
static_cast<A&>(*b1) = (*b2);
cout << "affter changer " << endl;
cout << "b1.i_ = " << b1->i_ << endl;
cout << "b1.j_ = " << b1->j_ << endl;
return 0;
}
輸出的結(jié)果是
before changer
b1.i_ = 6
b1.j_ = 6
affter changer
b1.i_ = 9
b1.j_ = 6
由此可見(jiàn), static_cast<A&>(*b1) = (*b2); 類(lèi)型轉(zhuǎn)換完成之后的賦值操作知識(shí)將基類(lèi)的變量進(jìn)行了賦值,當(dāng)然,前提是基類(lèi)沒(méi)有重載“=”運(yùn)算符的時(shí)候,不會(huì)涉及到派生類(lèi)。