功能虚拟化的行为

时间:2012-05-09 20:57:49

标签: c++ virtual

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时,会导致分段错误。

我认为这背后有一些我不了解的基本逻辑。请注意为什么会这样?

1 个答案:

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