64,665
社区成员
发帖
与我相关
我的任务
分享
class A{
char *Aname ;
A(){
Aname =new [strlen(typeid(*this).name())+1];
}
virtual void print(){cout<<Aname<<endl;};
~A(){
print();//如果允许正常,调用虚函数,此时 this->Bname 就是野指针。
//非虚函数,是不存在的这个问题的
//C++编译器,经过处理,调用虚函数和非虚函数结果基本一致,避免了野指针的问题。
//但是也因此,造成此处虚函数的调用,和其他时候调用虚函数;
//效果不一致,达不到多态的效果了。
//所以才有,析构函数,不要调用虚函数的说法。
delete []Aname;
};
};
class B()
{
char *Bname
B(){
Bname =new [strlen(typeid(*this).name())+1];
strcpy(
}
void print()const{
cout<<Bname<<endl;//这里只有读操作,效果还不严重,如果写入数据,那就会严重得多了。
//所以,C++ 中,编译器,处理了虚函数,在析构函数中的调用,解决掉相当一大部分的问题。
};
~ B(){
print();
delete []Bname;//在此以后,Bname称为野指针。
//~B()结束后,会自动调用 ~A() 函数,如果此时,还正常调用虚函数
//就和在这里调用 print(); 效果一致了
};
};
int main(){
A * pa=new A();
A *pb =new B();
delete pb;
delete pa;
return 0;
}