C++中的名字查找问题解答

朋友最近发邮件问我两个问题。内容如下(为了更适合阅读,我做了简单修改。译者在此基础上又做了修改):

我在C++的多继承上遇到了很大麻烦。

如图1,A、B1和B2为纯抽象类;C从B1、B2多继承,且实现了全部父类的抽象方法。


图1

现在:

C* p = new C;
p->Method_of_A(); //从B1、B2都能得到被调用方法,为什么编译器不报“二义性”(ambiguity)错误呢?

而按图2结构实现继承关系后:


图2

B4* p = new C;
p->Method_of_A();

编译器(VC++)认为有二义性。经调试我发现编译过程中使用了“adjustor thunk”(译者注:具体请参看http://blog.sina.com.cn/u/491874bb010004xq或Stan Lippman的《Inside the C++ Object Model》)。希望您能解答这两个问题,以帮助我更好理解C++(更确切的说是VC++)中的MI(多继承)机制。

时间: 2024-10-29 07:43:46

C++中的名字查找问题解答的相关文章

C++中名字隐藏,名字查找优先于类型检查

题目 C++中名字隐藏是什么? 解答 让我们通过一个例子来讲解C++中的名字隐藏.在C++中,如果一个类里有一个重载的方法, 你用另一个类去继承它并重写(覆盖)那个方法.你必须重写所有的重载方法, 否则未被重写的方法会因为名字相同而被隐藏,从而使它在派生类中不可见. 请看例子: class FirstClass{ public: virtual void MethodA(int); virtual void MethodA(int, int); }; void FirstClass::Metho

《C++覆辙录》——2.11:运算符函数名字查找的反常行为

2.11:运算符函数名字查找的反常行为 重载的运算符真的只不过就是可以用中序语法调用的地地道道的成员函数或非成员函数罢了.它们是"语法糖": class String{ public: String &operator =(const String&); friend String operator +(const String&, const String&); String operator–(); operator const char*() co

Excel表格中数据比对和查找的几种技巧

  Excel表格中数据比对和查找的几种技巧          应用案例一:比对取出两表的交集(相同部分) Sheet1中包含了一份数据清单A,sheet2中包含了一份数据清单B,要取得两份清单共有的数据记录(交集),也就是要找到两份清单中的相同部分. 方法1:高级筛选 高级筛选是处理重复数据的利器. 选中第一份数据清单所在的数据区域,在功能区上依次单击[数据]--[高级](2003版本中菜单操作为[数据]--[筛选]--[高级筛选]),出现[高级筛选]对话框. 在对话框中,筛选[方式]可以根据

如何在WPS表格中进行快速查找

通常情况下,用户经常会在WPS表格中进行数据查找,比如以姓"李"的人员.以-1结尾的货品编码或者包含66的电话号码等等,目前WPS表格提供了模糊查找和精确查找两种方式供用户使用,下面将对WPS表格的查找替换功能进行简单介绍. 模糊查找 这里说的"模糊查找"主要是指用户使用通配符进行查找--即支持"*"号和"?"号的查找. 在WPS表格里面,系统提供了两个可用的通配符能够用于模糊查找,分别是?(问号)和*(星号).其中:?可以在

在Word 2010文档中突出显示查找到的内容

在Word 2010文档中可以突出显示查找到的内容,并为这些内容标识永久性标记.即使关闭"查找和替换"对话框,或针对 Word 2010文档进行其他编辑操作,这些标记将持续存在.在Word 2010中突出显示查找到的内容的步骤如下所述: 第1步,打开Word 2010文档窗口,在"开始"功能区单击"编辑"分组的"查找"下拉三角按钮,并在打开的下拉菜单中选 择"高级查找"命令,如图2010081201所示.

教你在Word 2010中设置自定义查找选项

在Word 2010的"查找和替换"对话框中提供了多个选项供用户自定义查找内容,操作步骤如下所述: 第1步,打开Word 2010文档窗口,在"开始"功能区的"编辑"分组中依次单击"查找"→"高级查找"按钮,如图2010081204所示. 图2010081204 单击"高级查找"按钮 第2步,在打开的"查找和替换"对话框中单击"更多"按钮打开&qu

C++箴言:如何访问模板化基类中的名字

假设我们要写一个应用程序,它可以把消息传送到几个不同的公司去.消息既可以以加密方式也可以以明文(不加密)的方式传送.如果我们有足够的信息在编译期间确定哪个消息将要发送给哪个公司,我们就可以用一个 template-based(模板基)来解决问题: class CompanyA {public: ... void sendCleartext(const std::string& msg); void sendEncrypted(const std::string& msg); ...};cl

Word2010中设置自定义查找选项

在Word2010的"查找和替换"对话框中提供了多个选项供用户自定义查找内容,操作步骤如下所述: 第1步,打开Word2010文档窗口,在"开始"功能区的"编辑"分组中依次单击"查找"→"高级查找"按钮,如图1所示. 图1 单击"高级查找"按钮 第2步,在打开的"查找和替换"对话框中单击"更多"按钮打开"查找和替换"对话框的扩展

Win8中SkyDrive应用 常见问题解答

Win8中SkyDrive应用 常见问题解答.以下是一些有关 Windows 8 和 Windows RT 的 SkyDrive 应用的常见问题解答. 我能否查看其他人与我共享的文件和文件夹? 如果他人访问 SkyDrive.com 并通过向你发送包含链接的电子邮件来共享文件或文件夹,你可以在 SkyDrive 应用中查看该文件或文件夹. 点击或单击屏幕顶部的箭头,然后选择"共享". 在对项目进行共享之后,可能需要几分钟时间它们才会出现在该应用中. 如何查看我最近打开过的 Office