class CBase {
public:
void print()
{
cout<<"In base print func\n";
};
};
class CDerived: public CBase {
public:
void print()
{
cout<<"In derived print func\n";
};
};
int main()
{
CBase b;
CBase* pb;
CDerived d;
CDerived* pd;
pd->print();
return 0;
}
上面的代码运行正常,但是当我将CBase
类中的打印功能设为virtual
时,会导致分段错误。
我认为这背后有一些我不了解的基本逻辑。请注意为什么会这样?
答案 0 :(得分:3)
CDerived* pd;
pd->print();
指针未初始化 - &gt;未定义的行为。
你需要
CDerived* pd = new CDerived;
pd->print();
此外,它运行不正常。或者更确切地说,你运气不错是不吉利的。虚拟分派需要一个虚拟表,由于指针未初始化,虚拟表指针不存在,这就是当函数是虚拟时崩溃的原因。
如果它不是虚拟的,它仍然是未定义的行为,但它不会崩溃,因为它不使用任何成员。
要证明这一点,请尝试以下方法:
class CBase {
public:
int y;
void print()
{
cout<<"In base print func\n" << y;
};
};
class CDerived: public CBase {
public:
int x;
void print()
{
cout<<"In derived print func\n" << x;
};
};
即使函数不是virtual
,它也会崩溃。