c++中类数据成员的重载问题

王朝c/c++·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

今天犯了混,搞得自己晕了半天,以下是我问题总结:

class A

{

public:

A() : m_run(false) {}

virtual void Work(){}

bool GetRunning() {return m_run;}

protected:

bool m_run;

};

class B : public A

{

public:

B() : m_run(false) {}

//override from baseclass

virtual void Work();

protected:

bool m_run;

};

void class B::Work()

{

m_run = true;

}

void runit(A *a)

{

a->Work();

if (GetRunning() == false)

cout << "wrong";

else

cout << "right";

}

int main()

{

B *b = new B();

runit(b);

}

输出结果:wrong

本来想让class B控制其基类class A的受保护数据成员m_run,结果不小心给派生类也加上了一个相同的数据成员。

虽然我在派生类的操作中修改了m_Run的值为true,但这个值是属于派生类的,派生类重载了基类的数据成员,在派生类直接使用的就是这个派生类自己的数据成员。但是派生类可以通过GetRunning去访问积累的数据成员的值,这两个值可以不相同。

所以在通过基类指针进行多态访问的时候,基类的函数GetRunning返回的结果是基类数据成员m_Run,而不是派生类的数据成员m_Run。由于基类的m_Run自从构造函数默认初始化之后,值就在没有变过。

教训:

1)尽量将数据成员放在类的private区域内,这样最安全。

2)千万不可以重载基类的数据成员,本例子就是一个教训。

3)对这种重载的函数可以使用作用域操作附来区分他们,比如A::m_run B::m_run 。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航