有关upcasting 和 slicing , 看下面这段代码
#include <iostream>
using namespace std;
class CObject
{
public:
void Serialize() { cout << "CObject::Serialize() /n/n"; }
};
class CDocument : public CObject
{
public:
int m_data1;
void func()
{
cout << "CDocument::func()" << endl;
Serialize();
}
virtual void Serialize() { cout << "CDocument::Serialize() /n/n"; }
};
class CMyDoc : public CDocument
{
public:
int m_data2;
void Serialize() { cout << "CMyDoc::Serialize() /n/n"; }
};
//---------------------------------------------------------------
void main()
{
CMyDoc mydoc;
CMyDoc* pmydoc = new CMyDoc;
cout << "#1 testing" << endl;
mydoc.func();
cout << "#2 testing" << endl;
((CDocument*)(&mydoc))->func();
cout << "#3 testing" << endl;
pmydoc->func();
cout << "#4 testing" << endl;//类的强制类型转换改变了虚函数表
((CDocument)mydoc).func();//CDocument::Serialize()
cout << "#5 testing" << endl;
pmydoc->func();
}
1 类的强制类型转换(upcasting) 改变了虚函数表,使其变成了父类的虚汗数表
2 upcasting 并不是常用的操作,使用时应当小心,甚至避免
3 还需注意强制类型转换只是生成一个新的值,而不改变原有的值、
4 由于虚函数及虚汗数表机制的存在,父类的函数也可以调用派生类的函数
本文通过一个具体的C++代码示例,展示了upcasting(向上转型)如何影响虚函数表,进而影响到运行时的多态行为。文章强调了upcasting操作在实际编程中的注意事项及其潜在风险。

被折叠的 条评论
为什么被折叠?



