class CBase {
public:
void print()
{
cout<<"In base print funcn";
};
};
class CDerived: public CBase {
public:
void print()
{
cout<<"In derived print funcn";
};
};
int main()
{
CBase b;
CBase* pb;
CDerived d;
CDerived* pd;
pd->print();
return 0;
}
上面的代码运行良好,但是当我在类CBase
中按virtual
制作打印函数时,它会导致分段错误。
我认为这背后有一些我不知道的基本逻辑。请给出您的意见,为什么会这样?
CDerived* pd;
pd->print();
指针未初始化 ->未定义的行为。
你需要
CDerived* pd = new CDerived;
pd->print();
此外,它运行不正常。或者更确切地说,你很不走运,它运行良好。虚拟调度需要一个虚拟表,并且由于指针未初始化,因此虚拟表指针不存在,这就是当函数为虚拟时它崩溃的原因。
当它不是虚拟的时,它仍然是未定义的行为,但它不会崩溃,因为它不使用任何成员。
要证明这一点,请尝试以下操作:
class CBase {
public:
int y;
void print()
{
cout<<"In base print funcn" << y;
};
};
class CDerived: public CBase {
public:
int x;
void print()
{
cout<<"In derived print funcn" << x;
};
};
即使功能不virtual
,它也会崩溃。