关于虚拟函数 派生类的虚拟函数表在虚拟函数改写后,指针是如何变为改写后的函数指针的?请教!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 虚拟函数表VTABLE。C++的虚拟函数机制,使用复杂。 编译器做的事~不太需要你来管它~如果你預期衍生類別有可能重新定義某一個成員函式,那麼你就在基礎類別中把此函式設為virtual。擁有純虛擬函式者為抽象類別(abstract Class),以別於所謂的具象類別(concrete class)。纯虚函数就是函数被赋予值0的虚函数。为了达到动态链接(后期链接)的目的,C++编译器通过某种表格,在执行时起[间接]呼叫实际上欲链接的函数(注意[间接]这个字眼)。这样的表格成为虚函数表(常被称为vtable)。每一个[内含虚函数的类],编译器都会为它做出一个虚函数表,表中的每一个元素都指向一个虚拟函数的地址。此外,编译器当然也会为类加上一项成员变量,是一个指向该虚函数表的指针(常被称为vptr)。class Class1 {public :data1;data2;memfunc();virtual vfunc1();virtual vfunc2();virtual vfunc3();};Class1 物件實體在記憶體中佔據這樣的空間:-------------------------------------------------------------------------------------------------|Class1 物件實體 | vtable ||-------------------------------|---------------------------------------------------------------| |class Class1 | ||{ | ||public : | || m_data1; | || m_data2; | vptr ------- (*vfunc1)() ----- Class1::vfunc1() || memfunc(); | m_data1 ------- (*vfunc2)() ----- Class1::vfunc2() || virtual vfunc1(); | m_data2 ------- (*vfunc3)() ----- Class1::vfunc3() || virtual vfunc2(); | || virtual vfunc3(); | Class1::memfunc() ||} | |-------------------------------------------------------------------------------------------------奥妙在于这种虚函数表以及这种间接呼叫方式。虚函数表的内容是依据类中的虚函数声明次序,一一填入函数指针。派生类会继承基类的虚函数表(以及所有其它可以继承的成员),当我们自派生类中改写虚函数时,虚函数表就受了影响:表中元素所指的函数位置将不再是基类的函数位置,而是派生类的函数位置。class Class2 : public Class1 {public :data3;memfunc();virtual vfunc2();};-------------------------------------------------------------------------------------------------|Class2 物件實體 | vtable ||-------------------------------|---------------------------------------------------------------| |class Class2 | ||{ | ||public : | || m_data3; | || memfunc(); | vptr ------- (*vfunc1)() ----- Class1::vfunc1() || virtual vfunc2(); | m_data1 (*vfunc2)() ----- Class2::vfunc2() ||} | m_data2 (*vfunc3)() ----- Class1::vfunc3() || | m_data3 || | Class2::memfunc() || | |-------------------------------------------------------------------------------------------------於是,一個「指向Class1 所生物件」的指针,所呼叫的vfunc2 就是Class1::vfunc2,而一個「指向Class2 所生物件」的指针,所呼叫的vfunc2 就是Class2::vfunc2。深入浅出MFC中如是说~ to jiangping_zhu(娜可露露之风之刃) 你可以把代码发给我看看么? to rivershan(笨猫)我想知道其中的机制,你能给我解释一下么? mfc中如何只读取txt中的数值部分到一个数组中,跳过字符部分 比较高深的问题,大家来探讨探讨吧,出语才有分!!! 为什么不能返回函数中new的空间 求教:画线的问题???? 请问如何讲一个文件复制到另一个目录下或当前目录下 问个关于字符串格式化输出后的问题 问一个属性有关的问题 初级问题 刚学vc --- 求教简单的单文档视图的问题 微软专家与COM大腕~~~~关于ISupportErrorInfo/IErrorInfo/IError的问题 怎样向一个字符串中添加全角空格?全角空格应该怎样表示? 我的CAsyncSocket非阻塞异步出现这样的问题,很急的。。。。(在线等待。。。)
不太需要你来管它~
如果你預期衍生類別有可能重新定義某一個成員函式,那麼你就在基礎類別中把此函式設為virtual。擁有純虛擬函式者為抽象類別(abstract Class),以別於所謂的具象類別(concrete class)。纯虚函数就是函数被赋予值0的虚函数。为了达到动态链接(后期链接)的目的,C++编译器通过某种表格,在执行时起[间接]呼叫实际上欲链接的函数(注意[间接]这个字眼)。这样的表格成为虚函数表(常被称为vtable)。每一个[内含虚函数的类],编译器都会为它做出一个虚函数表,表中的每一个元素都指向一个虚拟函数的地址。此外,编译器当然也会为类加上一项成员变量,是一个指向该虚函数表的指针(常被称为vptr)。
class Class1
{
public :
data1;
data2;
memfunc();
virtual vfunc1();
virtual vfunc2();
virtual vfunc3();
};
Class1 物件實體在記憶體中佔據這樣的空間:
-------------------------------------------------------------------------------------------------
|Class1 物件實體 | vtable |
|-------------------------------|---------------------------------------------------------------|
|class Class1 | |
|{ | |
|public : | |
| m_data1; | |
| m_data2; | vptr ------- (*vfunc1)() ----- Class1::vfunc1() |
| memfunc(); | m_data1 ------- (*vfunc2)() ----- Class1::vfunc2() |
| virtual vfunc1(); | m_data2 ------- (*vfunc3)() ----- Class1::vfunc3() |
| virtual vfunc2(); | |
| virtual vfunc3(); | Class1::memfunc() |
|} | |
-------------------------------------------------------------------------------------------------
奥妙在于这种虚函数表以及这种间接呼叫方式。虚函数表的内容是依据类中的虚函数声明次序,一一填入函数指针。派生类会继承基类的虚函数表(以及所有其它可以继承的成员),当我们自派生类中改写虚函数时,虚函数表就受了影响:表中元素所指的函数位置将不再是基类的函数位置,而是派生类的函数位置。
class Class2 : public Class1
{
public :
data3;
memfunc();
virtual vfunc2();
};-------------------------------------------------------------------------------------------------
|Class2 物件實體 | vtable |
|-------------------------------|---------------------------------------------------------------|
|class Class2 | |
|{ | |
|public : | |
| m_data3; | |
| memfunc(); | vptr ------- (*vfunc1)() ----- Class1::vfunc1() |
| virtual vfunc2(); | m_data1 (*vfunc2)() ----- Class2::vfunc2() |
|} | m_data2 (*vfunc3)() ----- Class1::vfunc3() |
| | m_data3 |
| | Class2::memfunc() |
| | |
-------------------------------------------------------------------------------------------------
於是,一個「指向Class1 所生物件」的指针,所呼叫的vfunc2 就是Class1::vfunc2,而一個「指向Class2 所生物件」的指针,所呼叫的vfunc2 就是Class2::vfunc2。
深入浅出MFC中如是说~
你可以把代码发给我看看么?
我想知道其中的机制,你能给我解释一下么?