多态性问题C ++

时间:2011-05-13 09:22:51

标签: c++ inheritance pointers reference polymorphism

我有这些课程:

class A
{
};

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

我不太确定以下内容对于新手是否是好建议,但使用这样的引用会起作用:

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

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

我有点担心这实际上是设计糟糕的表现。如果它只是为了学习目的,请继续前进,理解永远是重要的

答案 1 :(得分:1)

指针m_int将保持不变,但指向*m_int将发生变化,您还必须通过引用传递值val这个功能。

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

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

m_int引用相同的变量。

答案 2 :(得分:0)

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

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

和m_int的类型应为int*而不是int

对于第二个问题,你将派生类的值存储在指向base的指针中,所以当你试图查看obj2中的内容时,你只能看到类型base的部分,这就是你得到消息的原因,无法评估子项。
Edit--
如果你想看看obj2中究竟是什么,你应该再次将它转换为派生类型。你可能并不总是在运行时知道......