c语言中d1的分辨率是,C中的方法分辨率顺序
C中没有像MRO那样的MRO.如果一个方法是模糊的,那么这是一个编译时错误.一个方法是否是虚拟的不影响它,但虚拟继承会.
该算法在C标准§[class.member.lookup](10.2)中描述.基本上它将在超类图中找到最接近的明确的实现.该算法的工作原理如下:
假设你想在C类中查找一个函数f.
>我们定义一个查找集合S(f,C),它是一组表示所有可能性的集合(Δ,Σ). (§10.2/ 3)
>集合Δ称为声明集,这基本上都是可能的f.
>集合Σ被称为子对象集,它包含找到这些f的类.
>让S(f,C)包括C中直接定义(或使用ed)的所有f(如果有的话)(§10.2/ 4):
Δ = {f in C};
if (Δ != empty)
Σ = {C};
else
Σ = empty;
S(f, C) = (Δ, Σ);
>如果S(f,C)为空(§10.2/ 5),
>计算S(f,Bi)其中Bi是C的基类,对于所有i.
将每个S(f,Bi)逐个合并成S(f,C).
if (S(f, C) == (empty, empty)) {
B = base classes of C;
for (Bi in B)
S(f, C) = S(f, C) .Merge. S(f, Bi);
}
>最后,声明集作为名称解析的结果返回(§10.2/ 7).
return S(f, C).Δ;
>两个查找集合(Δ1,Σ1)和(Δ2,Σ2)之间的合并定义为(§10.2/ 6):
>如果Σ1中的每个类都是Σ2中至少一个类的基类,则返回(Δ2,Σ2).
(反之亦然)
>否则如果Δ1≠Δ2,则返回(模糊,Σ1∪Σ2).
>否则返回(Δ1,Σ1∪Σ2)
function Merge ( (Δ1, Σ1), (Δ2, Σ2) ) {
function IsBaseOf(Σp, Σq) {
for (B1 in Σp) {
if (not any(B1 is base of C for (C in Σq)))
return false;
}
return true;
}
if (Σ1 .IsBaseOf. Σ2) return (Δ2, Σ2);
else if (Σ2 .IsBaseOf. Σ1) return (Δ1, Σ1);
else {
Σ = Σ1 union Σ2;
if (Δ1 != Δ2)
Δ = ambiguous;
else
Δ = Δ1;
return (Δ, Σ);
}
}
例如(§10.2/ 10),
struct V { int f(); };
struct W { int g(); };
struct B : W, virtual V { int f(); int g(); };
struct C : W, virtual V { };
struct D : B, C {
void glorp () {
f();
g();
}
};
我们计算
S(f, D) = S(f, B from D) .Merge. S(f, C from D)
= ({B::f}, {B from D}) .Merge. S(f, W from C from D) .Merge. S(f, V)
= ({B::f}, {B from D}) .Merge. empty .Merge. ({V::f}, {V})
= ({B::f}, {B from D}) // fine, V is a base class of B.
和
S(g, D) = S(g, B from D) .Merge. S(g, C from D)
= ({B::g}, {B from D}) .Merge. S(g, W from C from D) .Merge. S(g, V)
= ({B::g}, {B from D}) .Merge. ({W::g}, {W from C from D}) .Merge. empty
= (ambiguous, {B from D, W from C from D}) // the W from C is unrelated to B.
c语言中d1的分辨率是,C中的方法分辨率顺序相关推荐
- python语言中print函数的作用_python中print()方法有什么
python中print()方法有什么 发布时间:2020-11-11 13:50:08 来源:亿速云 阅读:91 作者:小新 这篇文章给大家分享的是有关python中print()方法有什么的内容. ...
- 转载——C语言中float,double类型,在内存中的结构(存储方式)
最近在做一个数据格式分析和转换的项目,第一次接触底层的二进制代码存储,看的一头雾水,看到这个帖子后对于在Windows系统下数据的存储方式有了更多的了解,将原文分享一下: 原文地址为http://ww ...
- 在c语言中char型数据在内存中的储存形式为什么
在c语言中char型数据在内存中的储存形式为"ASCII码".在C语言中,将一个字符常量放到一个字符变量中,实际并不是把该字符本身放到内存单元中,而是将与该字符相对应的ASCII码 ...
- 在c语言中 char型数据在内存中的存储形式是,在c语言中char型数据在内存中的存储形式是什么?...
在c语言中char型数据在内存中的存储形式是ASCII码.在C语言中,char型数据是将一个字符常量放到一个字符变量中,并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单 ...
- c语言计算存储大小,在C语言中5种基本数据类型的存储空间长度的排列顺序
在C语言中5种基本数据类型的存储空间长度的排列顺序 來源:互聯網 2010-04-22 19:19:59 評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 問題 ...
- 素数在c语言表达能力,巧用C语言中的Continue语句解决数论中的问题
.#0 福建电脑!""#年第$%期 巧用!语言中的!"#$%&'(语句解决数论中的问题 杨爱梅 !河南工业大学河南郑州"#$$#%& !摘要!运 ...
- c语言中的if语句_If ... C中的其他语句解释
c语言中的if语句 Conditional code flow is the ability to change the way a piece of code behaves based on ce ...
- c语言中point的用法_C/C++中 *和amp;的爱恨情仇
C++中&和*的用法一直是非常让人头疼的难点,课本博客上讲这些的知识点一般都是分开讲其用法的,没有详细的总结,导致我在这方面的知识结构格外混乱,在网上找到了一篇英文文章简单总结了这两个符号的一 ...
- r语言中的while循环_R编程中的While循环
r语言中的while循环 In addition to the for loop we discussed earlier, R also offers another kind of loop to ...
- 编程c语言中,向上取整函数_C编程中的函数
编程c语言中,向上取整函数 什么是功能? (What is a Function?) A Function is a block of statements that performs a speci ...
最新文章
- prop和attr在 jquery的
- 杭电1259ZJUTACM
- 【QT】QT从零入门教程(五):图像文件操作 [新建打开保存]
- 并联串联混合的电压和电流_如何从本质上判断电压表测量谁的电压?
- 如何正确的卸载MATLAB7?
- 冒泡排序(C语言代码介绍)
- 大学生创新创业 /互联网+ 大赛 商业计划书目录(模板)
- 1.深入浅出:理解三极管截止、放大和饱和状态!——参考《模拟电子技术基础》清华大学华成英主讲
- 【python】Anaconda3环境安装
- Mac系统如何制作Mac U盘启动盘(更新至mac 12.6)
- 上海市计算机三级 是什么水平,上海计算机等级考试跟全国计算机等级考试有什么区别吗?...
- 谷歌浏览器崩溃之错误代码:RESULT_CODE_MISSING_DATA
- 计算机网络实验:路由器交换机与其基本配置操作、常见命令
- JAVA中RandomAccess接口
- 腾讯 2022 校招大厂薪资首发,白菜总包接近 40w!
- CreateEvent和SetEvent函数
- 基于51单片机的自动窗帘控制系统
- java.net.UnknownHostException 异常处理(个人案例)
- 蓝桥杯题目练习(旅行家的预算)
- C语言 有a个学生,每个学生有b门课程的成绩。输入学生的序号后输出对应的全部成绩