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

标签 c++ pointers inheritance

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

为了某些背景,我创建了一个基类和一个派生类。这个派生类继承了一些成员变量和这些变量的一些get/set函数。这个派生类还实现了两个从基类继承的纯虚函数。

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

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

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

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

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

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

我正在尝试做的事情在 C++ 中是不允许的吗? 感谢任何人能给我的帮助。

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

Creature* characterSelect()
{
    Creature* creature;
    Goblin gb1 = Goblin();
    creature = &gb1;
    return creature;
}

最佳答案

Creature* creature;
Goblin gb1 = Goblin();
creature = &gb1;
return creature;

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

你需要用 new 创建你的地精:

Goblin *gb1 = new Goblin();
return gb1;

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

参见:returning local variables


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

关于c++ - 奇怪的指针行为 C++/继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30090845/

相关文章:

c++ - 构建一个项目,其中文件待定参数

C 中的强制转换和赋值

entity-framework - 使用 Include 的派生类的急切加载属性

java - java中的接口(interface)和继承

c++ - 复制构造函数是否调用默认构造函数来创建对象

c++ - 为什么我们使用 'this->' 而不是 'this.' 来访问成员?

C++ 模板无法在 Linux GCC 上编译

c - 从 C 中的结构开始

C++ 在类的成员函数内附加指针 vector 导致奇怪的行为

javascript - 在 JavaScript 中使用 InstanceOf 和原型(prototype)继承