當將一個派生類強制轉換成基類類型的時候,轉換方式不一樣會產生不一樣的效果。例如該代碼:static_cast<base&>(*this) ;
base 是基類,這句代碼是將當前對象強制轉化為積累類型的對象的引用,這樣的話不會再次調用基類的構造函數。若轉換成基類對象那就要調用基類的構造函數并創建出新的對象來了。
完整的代碼:
#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;
}
輸出的結果是
before changer
b1.i_ = 6
b1.j_ = 6
affter changer
b1.i_ = 9
b1.j_ = 6
由此可見, static_cast<A&>(*b1) = (*b2); 類型轉換完成之后的賦值操作知識將基類的變量進行了賦值,當然,前提是基類沒有重載“=”運算符的時候,不會涉及到派生類。