c++ primer习题中发现的问题,习题是18.13。

这个问题很久前有过讨论,不过没有得出正确结论,原贴。

先上代码:

struct A {virtual ~A() {}
};struct B : A {};struct C : B {};struct D : B, A {};

继承层次很清楚,就是照着书上抄的,没写实例化。使用如下编译命令:

g++ -o test -Wall test.cpp

得到如下警告:

warning: direct base 'A' inaccessible in 'D' due to ambiguity

gdb调试发现D中两个独立的A被正确构造。很奇怪一般二义性不会在定义类的时候被警告,想了下,发现原因其实很简单。

在D中的两个A的完整访问应该是D::B::A和D::A,但问题是D::A同样可以指向D::B::A,因为这个过程发生的是名字查找,每条路径都由内而外遵循名字查找规则,而每条路径都非虚或都虚的情况下,路径长短不作为区别优先的根据。所以无论如何第二个A实例都无法被访问。

之所以会遇到这个问题是因为我从java转c++,写全名写惯了,囧。

原贴中提到了另一个问题,我想这应该是很多人的第一反应:“是不是编译器要求虚继承呢?”继承层次改为:

struct A {virtual ~A() {}
};struct B : A {};struct C : B {};struct D : B, virtual A {};

或者:

struct A {virtual ~A() {}
};struct B : virtual A {};struct C : B {};struct D : B, A {};

可不可以呢?这时候奇葩的事情就发生了,见 原贴14楼,这应该是可以的,理由见c++ primer 17.3.6.2的第二款,虚继承优先级低于派生实例。但是我的g++ 4.7.2在实例化访问时报error:ambiguity。这个我就没法解释了。反正这种继承层次就是不合理的,避免就好。

关于warning: direct base 'A' inaccessible in 'D' due to ambiguity的一些讨论相关推荐

  1. 运行 iOS 模拟器中的 App 后显示空白-warning:Unsupported Configuration: Scene is unreachable due…

    错误警告码是:warning: Unsupported Configuration: Scene is unreachable due to lack of entry points and does ...

  2. 解决** WARNING ** : Your ApplicationContext is unlikely to start due to a @ComponentScan of the defau

    springboot  的application.java不能放在main.java下 需要建立一个新包 org.springframework.beans.factory.BeanDefinitio ...

  3. Python 类继承,__bases__, __mro__, super

    Python是面向对象的编程语言,也支持类继承. >>> class Base: ... pass ... >>> class Derived(Base): ... ...

  4. Python程序员必须深刻理解的几个Warning

    Python程序员必须深刻理解的几个Warning 在Python编程中,很多时候我们会看到一些Warning输出,这些信息通常是针对我们的代码中存在的问题或潜在的风险.但是有时候我们并不希望看到这些 ...

  5. 【足迹C++primer】52、,转换和继承虚函数

    转换和继承,虚函数 Understanding conversions between base and derived classes is essential to understanding h ...

  6. OpenShift 4 - CRC(Codeready Container)个人单机版 OpenShift 环境

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在支持OpenShift 4.9的Codeready Container环境中验证 文章目录 关于CRC - Coderead ...

  7. java implement 泛型_csharplang.zh-cn

    ms.openlocfilehash ms.sourcegitcommit ms.translationtype ms.contentlocale ms.lasthandoff ms.locfilei ...

  8. C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用

    C风格的强制转换较简单,如将float a转换为int b,则可以这样:b = (int)a,或者b=int(a). C++类型转换分为隐式类型转换和显示类型转换. 隐式类型转换又称为标准转换,包括以 ...

  9. codeigniter配置smarty模板

    codeigniter是一个比较不错的轻量级的php开发web frame,我将ci结合smarty模板解释器使用,现在ci配置smarty的方法给出: ①下载smarty的源码包并且解压 ②将sma ...

最新文章

  1. java 是怎么在中删除下拉列表_删除在一个下拉列表字段中选择的选项,并且不显示在该行中存在的其他下拉列表中不工作-jquery...
  2. 求教关于NFS服务器的防火墙的设置
  3. 读写测试_UFS3.0手机闪存测试曝光 读写速度足以秒杀超极本!
  4. 客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍
  5. stm32 JTag 错误
  6. [ATF]-ATF启动--BL31跳转到optee和uboot
  7. graph theory important questions
  8. mysql获取当前节点的所有叶子节点_mssql sqlserver 如何获取一个叶子节点下所有子节点呢?...
  9. 『ACM-数据结构』信息竞赛进阶指南--线段树
  10. Python 3.10新增软关键字实现真正意义上的多分支选择结构
  11. 【C语言】在线OJ题 BC7-BC52-牛客网编程初学者入门训练
  12. AI之语音转写项目实践
  13. 国家计算机二级c语言历年真题及答案,全国计算机二级C语言历年真题
  14. 已解决-Windows10没有windows照片查看器-Windows10打开照片是黑底的
  15. 35岁,技术转管理,空降新团队,测试管理的10问10答
  16. 什么是云计算?这个愚蠢的流行词是什么意思?
  17. 让C程序跳转到绝对地址0x100000处执行
  18. 得用户者得天下  解析明基的保时捷设计水准
  19. 【JavaWeb】JQuery实现广告显示和隐藏动画效果
  20. plt自定义水平线和垂直线、水平区域和垂直区域

热门文章

  1. UE4角色控制权获取
  2. 英语口语268之每日十句口语
  3. [附源码]SSM计算机毕业设计基于web的停车收费管理系统JAVA
  4. 停车场管理系统C语言作业,c语言课程设计报告停车场管理系统
  5. idea将java项目打成jar包
  6. 【自我管理篇】如何提高专注力
  7. 重装MySQL前,需彻底删除之前MySQL的数据,记录分享过程。
  8. [转]数据结构之Trie树
  9. ubifs mtd
  10. 浙江大学【面板数据分析与STATA应用】——第三讲内生性与工具变量法