我正在学习使用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以及如何让它这样做(如果仍然可以使用基类指针作为参数)。
答案 0 :(得分:4)
你的代码是有道理的,但可能不是你的想法。
您的班级Bar
有两个名为a
的成员,一个是Bar::a
,一个是Bar::Foo::a
,Foo
的成员1}}基类。
当您通过指针(例如Foo
)访问Bar
或p->a
对象时,您始终获取a
成员Foo
基础子对象。
换句话说,您无法“覆盖”数据成员。
您提到的其他代码只有一个数据成员,它看起来像这样:
struct Foo
{
int a;
Foo() : a(0) { }
protected:
explicit Foo(int n) : a(n) { }
};
struct Bar : Foo
{
Bar() : Foo(1) { }
};
请注意 Foo
和Bar
在此设置中只有一个数据成员a
。