【问题标题】:Polymorphism Problem C++多态问题 C++
【发布时间】:2011-05-13 09:22:50
【问题描述】:

我有这些课程:

class A
{
};

class B : public A
{
public:
    B(int val);
private:
    int* m_int;
};

B::B(int val)
{
    m_int = &val;
}

我这样调用代码,在 1 个函数内,我知道一旦超出范围,变量就会被销毁,但我只需要在这个函数中使用它们:

{
...
int _int = 0;
B obj(_int);
A *obj2 = &obj;
_int++;
...
}

问题是 _int 变为 1,但 m_int 保持不变。我需要 m_int 来反映 _int 中的值是什么,而无需使用代码对其进行更新。我认为有一个指向内存位置的指针会起作用吗?

第二个问题是,当我将鼠标悬停在 obj2 上时,为了查看 obj 的值,我收到消息“无法评估孩子”。

【问题讨论】:

  • 你的代码能编译吗?
  • 您发布的代码无法编译。首先,B的构造函数没有被声明,其次,在那个构造函数中,你将m_int设置为ref的地址,这个地址在你的代码中没有出现。
  • @iammiling 的意思是您的代码不应编译,因为B 没有采用int 的构造函数。
  • -1 用于发布代码,甚至无需先编译。
  • 是错字,代码可以编译。

标签: c++ inheritance pointers reference polymorphism


【解决方案1】:

我不太确定以下对于新手来说是否是好的建议,但使用这样的参考会起作用:

class B : A
{
public:
    explicit B(int& val);
private:
    int* m_int;
};

B::B(int& val)
{
    m_int = &val;
}

我有点担心这实际上是糟糕设计的标志。如果只是为了学习,那就去吧,理解总是很重要的

【讨论】:

  • +1 表示警告。像这样存储引用存在一定的生命周期问题。
【解决方案2】:

指针m_int 将保持不变,但指向*m_int 会改变,您还必须通过引用函数来传递值val

编辑:看到您编辑的问题,因为这是从您可以执行的构造函数中完成的:

class B : A
{
public:
    B(int& val) : m_int(val) {}
private:
    int& m_int;
};

m_int 引用同一个变量。

【讨论】:

    【解决方案3】:

    如果你想改变 _int 的值,你应该传递它的指针,你现在的做法是按值调用。

    B::B(int* val)
    {
        m_int = val; // not ref
    }
    

    并且 m_int 的类型应该是 int* 而不是 int

    对于第二个问题,您将派生类的值存储在指向基址的指针中,因此,当您尝试查看 obj2 内部的内容时,您只能看到类型基址的部分,这就是为什么您会收到无法评估子级消息的原因。
    编辑--
    如果您想查看 obj2 中的实际内容,您应该再次将其转换为派生类型。而且您可能并不总是知道在运行时...

    【讨论】:

    • @AtoMerZ 我在在线教程中看到,如果你想指向一个派生类,那么你可以这样做:'B obj2;' 'A *obj = &obj2;'这不是本示例的正确方法吗?
    • @PoiXen 这通常是在您拥有从同一个基类派生的不同类的不同对象时完成的,然后您将它们全部存储在指向基类的指针数组中。或者当您在类似情况下有一个函数参数时。否则,不需要将派生类存储在基类指针中,尽管您可以
    • @AtoMerZ 问题是。我需要将派生类存储在基指针中,然后存储在基指针向量中。像这样:'A *obj = &obj2;' 'std::vector vec;' 'vec.push_back(obj);'
    • @PoiXen 通常在这些情况下意味着您需要对象表现得像基类,那么我认为您不需要查看对象作为派生类具有什么。如果这样做,您应该以某种方式将类型信息与向量的每个元素一起存储,也许使用 STL 映射,将对象作为键,将类型作为值。
    • @AtoMerZ 我不知道是不是我傻了。 . .我确实认为使用地图会更好,但在此之前,当 'A *obj = &obj2;'发生——当我尝试检查 obj 的内容时,我得到的只是“无法评估孩子”。我有一种感觉,这可能是由于我的基类?如果你看原始代码,我只改变了 A,它现在有一个默认的构造函数和解构函数。两者都是空的。在子类 B 中,我使用了来自用户 @Andreas Brinck 的代码。似乎它应该可以工作,我应该能够从 A 看到 B 中的 var,但我不能。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2015-10-07
    相关资源
    最近更新 更多