[英]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.