奇怪的指针行为 C++/继承

wan*_*esy 1 c++ inheritance pointers

我目前正在使用指针,我想知道我是否正在做一些根本不起作用的事情。

对于某些背景,我创建了一个基类和一个派生类。这个派生类继承了一些成员变量和这些变量的一些获取/设置函数。这个派生类还实现了两个从基类继承的纯虚函数。

现在在包含与这些类交互的代码的主文件中,我有三个函数,分别称为 f1、main 和 f2。

F1 创建派生类的实例并返回指向该派生类的基类指针。在这个类F1中,我检查了int成员变量是否被设置为正确的数字,我还检查了派生类继承的虚函数是否正确实现。变量和函数都在 F1 范围内设置/正常工作。

Main 接收指向这个派生类的这个基类指针。在这个 main 函数中,我再次检查 int 成员变量是否设置为正确的数字,并且我还检查了派生类继承的虚函数是否正确实现。变量和函数都在主作用域中设置/正常工作。

但是,当我将指针作为基类指针参数传递给函数 F2 时。int 成员变量被设置为 0,当我访问虚拟函数时,我收到一个分段错误/核心转储错误。

为了进一步缩小原因,我访问了派生类实现文件,并在实现文件中创建了一个对象实例,并看到一切都按预期工作。

总而言之,我有一个指向派生类对象的基类指针。函数调用在创建它的函数和返回到的函数中完美地适用于这个指针。只有当指针作为基类指针的参数传递时,我才开始看到成员变量设置为 0 并且函数调用导致分段错误/核心转储。

我正在尝试做一些 C++ 不允许的事情吗?感谢任何人可以给我的任何帮助。

编辑:我在下面附上了代码。生物是基本情况;Goblin 是派生的 Case;功能 F1:

Creature* characterSelect()
{
    Creature* creature;
    Goblin gb1 = Goblin();
    creature = &gb1;
    return creature;
}
Run Code Online (Sandbox Code Playgroud)

tza*_*man 5

Creature* creature;
Goblin gb1 = Goblin();
creature = &gb1;
return creature;
Run Code Online (Sandbox Code Playgroud)

您正在返回对堆栈上对象的引用;在函数返回后尝试访问它是未定义的行为(即bad)。该内存被回收,它可能仍然有效,直到它被覆盖;这就是为什么你看到的东西仍然在 main.js 中工作。

您需要使用以下命令创建您的妖精new

Goblin *gb1 = new Goblin();
return gb1;
Run Code Online (Sandbox Code Playgroud)

这样它就被分配了堆,Goblin当你传递它时,实例将持续存在。

请参阅:返回局部变量


“那我什么时候删除它?”
仔细阅读“所有权”的概念——您需要跟踪 Goblin 实例“属于”谁,并且只要没有更多相关所有者,就可以将其删除。在实际代码中,无论如何您都不想使用裸指针,而是使用“智能指针”(即std::shared_ptrstd::unique_ptr)为您跟踪该指针并在不再需要对象时自动删除。