派生类中和基类中成员名称冲突时的访问

作者: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。在名称相同的情况下,要访问基类的同名变量或函数,必须明确指定。

参考资料

  1. <<C++实用教程>> 电子工业出版社 郑阿奇 主编 丁有和 编著
  2. The C++ Tutorial:
    http://www.learncpp.com/cpp-tutorial/116-adding-changing-and-hiding-members-in-a-derived-class/