函数的虚拟性行为


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,它也会崩溃。

最新更新