C ++:涉及继承和“使用”时的方法重载

时间:2017-08-03 06:40:10

标签: c++

假设有两个类:Base和Derived。代码如下所示。 我的问题是,该程序如何知道d.print()(在代码中使用A标记)是打算调用Derived::print()而不是Base::print()?< / p>

请注意,我故意添加using Base::print;以混淆编译器。这两个print()方法具有相同的签名(我是对的吗?)并且由于using语句而没有相互隐藏。

#include <iostream>
using namespace std;

class Base {
public:
    void print() { cout << "print() of Base is called\n"; }
};

class Derived : public Base {
public:
    void print() { cout << "print() of Derived is called\n"; }
    using Base::print; // I delibarately added this line
};

int main() {
    Derived d;
    d.print(); // A

    Base *pBase = (Base *)&d;
    pBase->print(); // B
}

结果是

 print() of Derived is called
 print() of Base is called

编辑:接受的答案给出了引用。为了方便读者,我在这里粘贴(几乎)整个引用的段落,用句子分开:

  

Using-declaration将基类的成员引入派生类定义,例如将base的受保护成员公开为派生的公共成员..(这就是我所期望的)

     

如果名称是基类的重载成员函数的名称,则引入具有该名称的所有基类成员函数。 (这也是我的预期)

     

如果派生类已具有具有相同名称,参数列表和限定条件的成员,则派生类成员将隐藏或覆盖(不冲突)从基类引入的成员。 (解决了我的问题)

1 个答案:

答案 0 :(得分:4)

由于此规则(来自cppreference documentation for using

,显式引入的using不会隐藏派生类中的方法
  

如果派生类已经有一个具有相同名称,参数列表和限定条件的成员,则派生类成员会隐藏或覆盖(不冲突)从基类引入的成员。

编译器不会混淆,它正在做正确的事情。 using未在派生类中隐藏print()方法,因为它定义了print()方法。

当您使用print()指针调用Base时,print()不是虚拟的,基本指针只能调用使用其指向的事物的静态类型注册的方法,即Base::print()