C++的一个小问题?
class CBase
{
public:
CBase *pointer;
public:
CBase()
{
cout<<"cbase constructor!"<<endl;
//pointer=this;
}
virtual void Output1()
{
cout<<"output cbase class!"<<endl;
}
};
class CDerived :public CBase
{
public:
void Output1()
{
//pointer=this;
cout<<"output CDerived class!"<<endl;
}
};
int main()
{
CBase base;
base.pointer->Output1();
CDerived derived;
derived.pointer->Output1();
return 0;
}
编译链接都没问题,就运行有错误提示。
我的问题就是为何用pointer指针调用函数就出问题了。我试了简单程序,不是指针没初始化的问题。如果virtual关键字删掉,运行就没问题了,为何加了virtual就有问题了呢?
[解决办法]
不赋值是野指针,读不了虚函数表,取地址是访问非法内存
[解决办法]
pointer是野指针,那它本来包含的虚函数表__vfptr也是野指针,而函数必须从它那得到函数地址,因此读它的值时就访问非法地址了,所以crash
[解决办法]
如需要阅读该回复,请登录或注册CSDN!
[解决办法]
单步调试时看到pointer如下
pointer0xcccccccc
|---__vfptrCXX0030: Error: expression cannot be evaluated
|---pointerCXX0030: Error: expression cannot be evaluated
[解决办法]
如需要阅读该回复,请登录或注册CSDN!
[解决办法]
18楼的高人说明的十分清楚了,其实本身不是指针初始化的问题。虽然编程过程中要求指针尽量初始化,但有些未初始化的指针除了地址错误以外,在初学者的小段代码中没有影响的。关键是这里如18楼所说,你的类指针对你的虚函数调用是有影响的,所以不要钻在“指针该不该初始化”的问题中,而是应该弄明白其引发的其他问题。
比如这里是指针未初始化而引起的虚函数调用问题,那么回去深入学习时,就是着重看虚函数的调用规则为重点而不是去温习指针的初始化问题了。
可能表述方面有些偏差,还望楼主明白
[解决办法]
使用虚函数时,就会生成虚函数表,当调用虚函数时,就去查虚函数表,而虚函数表是在对象的内存中存放的,你的pointer指针没有指向具体的对象,它去哪找虚函数表呢:
好比叫你去某个地方取份材料,但没告诉你地址,你去哪取呢