admin管理员组

文章数量:1654378

当cderived。identify()被调用时,编译器查看identify()被派生类中定义的。还不行就开始寻找继承类中(在这种情况下是基地)。基地已经定义了一个identify()功能,因此使用一个。换句话说,基地::identify()是因为可得出::identify()不存在。

然而,如果我们定义的派生::派生类中的identify(),它会被用来代替。这意味着我们可以函数有不同的工作与我们的派生类的派生类中重新定义他们!

在我们上面的例子,如果cderived更加准确。identify()印有“我是一个来自“。让我们修改identify()因此返回正确的反应时,我们称identify()与派生类对象。

修改函数在基类中定义的函数在派生类中的工作方式,简单地重新定义派生类中的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Derived: public Base
{
public:
    Derived(int nValue)
        :Base(nValue)
    {
    }
 
    int GetValue() { return m_nValue; }
 
    // Here's our modified function
    void Identify() { cout << "I am a Derived" << endl; }
};


一句警告:原型(返回值,函数名,参数)派生类中的函数必须在基类完全相同。如果返回值不匹配,编译器将发出一个错误。如果参数或函数的名称是不同的,C++将此视为一个附加功能而非修改的功能!

还注意到,当你重新定义派生类中的函数,导出不继承访问说明符的功能中具有相同名称的类的基类。它可以使用任何访问说明符定义它是在派生类中的。因此,一个函数被定义为在基类的私有可以重新定义为公共的派生类,反之亦然!

添加到现有的功能

有时我们不想完全取代基类的函数,而是要向其添加额外的功能。在上面的例子中,注意来源::identify()完全隐藏基地::identify()!这可能不是我们想要的。它可能有我们导出的函数调用的名称相同的基函数(为了重用代码),然后添加额外的功能到它。

有一个函数调用的名称相同的基础功能,简单地做一个普通的函数调用,但前缀的函数的作用域限定符(基地班和两个冒号名称)。下面的示例定义来源::identify()所以首先调用基::identify()然后它自己的额外的东西。


本文标签: identify