假设有两个类: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的受保护成员公开为派生的公共成员..(这就是我所期望的)
如果名称是基类的重载成员函数的名称,则引入具有该名称的所有基类成员函数。 (这也是我的预期)
如果派生类已具有具有相同名称,参数列表和限定条件的成员,则派生类成员将隐藏或覆盖(不冲突)从基类引入的成员。 (解决了我的问题)
答案 0 :(得分:4)
由于此规则(来自cppreference documentation for using
)
using
不会隐藏派生类中的方法
如果派生类已经有一个具有相同名称,参数列表和限定条件的成员,则派生类成员会隐藏或覆盖(不冲突)从基类引入的成员。
编译器不会混淆,它正在做正确的事情。 using
未在派生类中隐藏print()
方法,因为它定义了print()
方法。
当您使用print()
指针调用Base
时,print()
不是虚拟的,基本指针只能调用使用其指向的事物的静态类型注册的方法,即Base::print()