繁体   English   中英

C ++继承虚拟函数崩溃

[英]C++ Inheritance virtual function crashing

我不知道为什么这段代码崩溃了,对我来说看起来是正确的,但是它只是使用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 fly\n", tryFlyOOP(duckV) ? "can" : "can't");
    printf("OOP Penguins %s fly\n", 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") << " fly\n";

这将要求您使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”运算符创建新对象,并将其分配给这些变量。 或者-更好的是-在堆栈上创建它们并传递引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM