C ++继承和成员访问问题

时间:2013-04-25 22:32:24

标签: c++ inheritance casting

我正在学习使用c ++的OOP,并遇到了一个我不太了解的情况。

{了解公共数据成员的不良做法并假设指针不是NULL}:

...

class Foo {
    public: int a = 0;
}

class Bar: public Foo {
   public: int a = 1;
}

void display (Foo * in) {
    if(in->a)
        cout << "I'M A BAR" << endl;
    else
        cout << "I'M A FOO" << endl;
}

int main() {
    Foo * BAR = new Bar;
    display(BAR); //Displays "I'M A FOO"
    return 0;
}

经过多一点修修补补后,我发现如果我改为使用构造函数将非const int值分别设置为0和1并且还从构造函数输出值,我看到该值实际上设置为1 in BAR,但在显示功能中被评估为0。

我很抱歉,如果这没有意义,我怀疑我真的很清楚地问正确的问题,但我想知道为什么BAR不被视为显示内部的Bar以及如何让它这样做(如果仍然可以使用基类指针作为参数)。

1 个答案:

答案 0 :(得分:4)

你的代码是有道理的,但可能不是你的想法。

您的班级Bar两个名为a成员,一个是Bar::a,一个是Bar::Foo::aFoo的成员1}}基类。

当您通过指针(例如Foo)访问Barp->a对象时,您始终获取a成员Foo基础子对象。

换句话说,您无法“覆盖”数据成员。

您提到的其他代码只有一个数据成员,它看起来像这样:

struct Foo
{
    int a;
    Foo() : a(0) { }
protected:
    explicit Foo(int n) : a(n) { }
};

struct Bar : Foo
{
    Bar() : Foo(1) { }
};

请注意 FooBar在此设置中只有一个数据成员a