class Base
{
public:
Base()
{
cout << "base create" << endl;
}
Base(const Base& b)
{
*this = b;
cout << "base copy create" << endl;
}
~Base()
{
cout << "base destroy" << endl;
}
virtual void run()
{
cout << "base run" << endl;
}
};
class CMy : public Base
{
public:
CMy()
{
cout << "cmy create" << endl;
}
~CMy()
{
cout << "cmy destroy" << endl;
}
void run()
{
cout << "cmy run" << endl;
}
};
int main()
{
CMy *p = new CMy();
//Base *bp = (Base *)p;
cout << "----------" << endl;
((Base *)p)->run();
cout << "----------" << endl;
(*((Base *)p)).run();
cout << "----------" << endl;
(*p).run();
cout << "----------" << endl;
//这种转换会产生临时对象
(static_cast<Base>(*p)).run();
cout << "----------" << endl;
delete p;
return 0;
}
我们可以得到一些思考,为什么虚函数并没有像上面几种情况下成功被子类隐藏?是因为这个时候的run是C++编译器产生的临时对象 Base ,此时的run 是Base的而不是子类的!
这行代码:(static_cast<Base>(*p)).run();等价于如下
{
Base bs(*p);
bs.run();
}
总结:
C++编译器 在对类(而不是类的指针)强制转换的时候会产生临时对象,这个是编译的时候就决定的,应此是属于编译器的静态转换 static_cast,可以通过拷贝构造函数的打印来证明这一点,临时对象是存在栈中的,但是开销还是有的,因此尽量少做(其实可以做到不做)对类的强制转换。