【发布时间】:2016-02-13 14:54:10
【问题描述】:
-
第一种情况
#include <iostream> class A { public: virtual void Write(int i) { std::wcout << L"Write(int) is called" << std::endl; } virtual void Write(wchar_t c) { std::wcout << L"Write(wchar_t) is called" << std::endl; } }; int _tmain(int argc, wchar_t* argv[]) { A *p = new A(); int i = 100; p->Write(i); return 0; }
完美运行。
程序输出
Write(int) 被调用
2.第二种情况。
只需将第一个函数移至基类:
#include <iostream>
class Base
{
public:
virtual void Write(int i)
{
std::wcout << L"Base::Write(int) is called" << std::endl;
}
};
class Derived: public Base
{
public:
virtual void Write(wchar_t c)
{
std::wcout << L"Derived::Write(wchar_t) is called" << std::endl;
}
};
int _tmain(int argc, wchar_t* argv[])
{
Derived *p = new Derived();
int i = 100;
p->Write(i);
return 0;
}
程序输出
Derived::Write(wchar_t) 被调用
但我预计“Base::Write(int) 被调用”
第二种情况有什么问题?
【问题讨论】:
-
@hvd:我认为这是重复的,但不是that question。
-
@hvd:这个问题确实通过派生类型的指针进行查找,即通过基类型。这个问题介绍了不同范围内的功能,一个在基类中介绍了它们。另一个问题似乎只是关于虚拟调度如何调用最衍生的覆盖器,与隐藏无关。
-
@hvd:或者另一个问题将“坏”(有趣)行为放在首位。在这种情况下,这个问题实际上调用了派生类中的重载,该问题调用了基类中的重载。名称隐藏在另一个问题中根本没有作用。
-
@BenVoigt 这已经足够令人信服了,谢谢。快速搜索会找到 C++ inheritance and name hiding 和 C++ inheritance, base methods hidden 尽可能更好的重复候选人。
标签: c++ inheritance member-functions name-lookup name-hiding