C++继承虚拟函数崩溃



我不知道为什么这个代码会崩溃,在我看来是正确的,但它只是用SIGSEV崩溃。我来自Java,习惯于"有用"的错误消息。。。

main.cpp

#include <cstdlib>
#include <stdio.h>
#include "DuckV.h"
#include "PenguinV.h" 
bool tryFlyOOP(IBird* birdy)
{
    return birdy->canFly();
}
int main(int argc, char** argv)
{
   DuckV* duckV;
   PenguinV* penguinV;
    printf("My OOP duck %s flyn", tryFlyOOP(duckV) ? "can" : "can't");
    printf("OOP Penguins %s flyn", tryFlyOOP(penguinV) ? "can" : "can't");
    return 0;
}

IBird:

#ifndef IBIRD_H
#define IBIRD_H
class IBird
{
public:
    IBird () {}
    virtual bool canFly() {return true;};
};
#endif  /* IBIRD_H */

除了名称和返回值之外,DuckV/PenguinV是相同的

#ifndef DUCKV_H
#define DUCKV_H
#include "IBird.h"
class DuckV : public IBird
{
public:
    DuckV(){}
    virtual bool canFly() {return true;}
};
#endif  /* DUCKV_H */

我试过改变一些东西,但我就是不明白。任何帮助都将不胜感激:)。

您尚未初始化指针:

DuckV* duckV; // points to a random location. No DuckV object exists.

我建议你放弃指针,做这样的事情:

bool tryFlyOOP(const IBird& birdy)
{
    return birdy.canFly();
}

然后

DuckV duckV;
std::cout << "My OOP duck " << (tryFlyOOP(duckV) ? "can" : "can't") << " flyn";

这需要您将canFly()成员函数设置为const:

class IBird
{
public:
    IBird () {}
    virtual bool canFly() const {return true;};
};

这是因为没有创建对象。

你应该做:

DuckV* duckV = new DuckV();
PenguinV* penguinV = new PenguinV();

在代码中,您只是声明了指针。

或者你可以做:

DuckV duckV;
PenguinV penguinV;
bool tryFlyOOP(const IBird& birdy)
{
    return birdy.canFly();
}

在最后一个例子中,你使用了参考,谁也是一个很好的方法。

您尚未初始化变量(duckV和penguinV)。由于要将它们用作指针,请使用"new"运算符创建新对象并将其分配给这些变量。或者——更好的是——在堆栈上创建它们并传递引用。

最新更新