下面这串代码从汇编角度分析的话,大家等几天,我看看,我目前只能从c++层面来解释
抓住一点(在多态调用非自身构造函数和析构函数时都会进行虚表替换)
#include<iostream>
#include<stdio.h>
using namespace std;
class CPerson {
public:
virtual const char* GetClassName() {
return "CPerson";
}
virtual void showspeak() {
printf("%s::showspeak()\r\n", GetClassName());
return;
}
CPerson() {
showspeak();
}
virtual ~CPerson() {
showspeak();
}
};
class CChinese :public CPerson {
public:
CChinese() {
showspeak();
}
virtual ~CChinese() {
showspeak();
}
virtual const char* GetClassName() {
return "CChinese";
}
};
void main() {
CPerson* pPerson = new CChinese;
pPerson->showspeak();
delete pPerson;
}
下面是执行的结果,最主要需要注意的是就是第一次为什么输出是CPerson,不是CChinese,因为在构造函数里面调用的时候已经把虚表给换了,被换成父类的虚表了,往下调用GetClassName时,这个对象的虚表已经是父类虚表了,所以这时只能在父类里面调用,调用函数的对象的自身虚表已经找不到了,它没办法多态了,从c++层面分析时注意这点就行,其它的都类似。

1307

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



