3
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中使用 print 函数时,virtual它会导致分段错误。

我认为这背后有一些我不知道的基本逻辑。请给出您的意见,为什么会这样?

4

1 回答 1

3
CDerived* pd;
pd->print();

指针未初始化 -> 未定义行为。

你需要

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

于 2012-05-09T20:59:09.003 回答