作者:jicanmeng
时间:2014年12月03日
假设基类有一个public类型的成员变量int m_nValue;
,在派生类中定义一个相同的public类型的成员变量int m_nValue
,那么如果使用派生类定义一个对象,则使用此对象访问m_nValue时访问的是哪一个呢?
看下面的示例程序:
#include <iostream> using namespace std; class Base { public: int m_nValue; public: Base(int nValue) : m_nValue(nValue) { } void Identify() { cout << "I am a Base" << endl; } }; class Derived: public Base { public: Derived(int nValue) :Base(nValue) { m_nValue = nValue+1; } int GetValue() { return m_nValue; } // Here's our modified function void Identify(){ cout << "I am a Derived" << endl; } void Identify2(){ Base::Identify(); } public: int m_nValue; }; int main() { Derived one(2); cout << one.m_nValue << endl; cout << one.Base::m_nValue << endl; one.Identify(); one.Base::Identify(); one.Identify2(); return 0; }
以下是运行结果:
[jicanmeng@andy tmp]$ ./a.out
3
2
I am a Derived
I am a Base
I am a Base
[jicanmeng@andy tmp]$
由此可见,对于基类和派生类中同名的变量m_nValue,如果定义一个派生类对象,访问m_nValue,访问的是派生类中的m_nValue。如果要访问基类中的m_nValue,需要明确指定,就像代码中44行所示。
类似的,如果基类和派生类中有同名的函数,那么如果要访问基类的函数,也需要明确指定。就像代码中47行所示。或者在派生类中定义一个函数,直接调用基类中的函数。就像代码中48行所示。
上例中,基类和派生类中的m_nValue的访问权限都是public,假如我们将派生类中的m_nValue设定为private再进行编译,那么编译报错。可以看出,如果派生类中的变量或函数名和基类中的相同,那么就会覆盖基类的同名变量和同名函数,即使对于这个同名变量来说,基类中的访问权限是public,派生类中的访问权限是private。在名称相同的情况下,要访问基类的同名变量或函数,必须明确指定。