C++ 虚拟遗传中的优势
C++98/C++03标准和C++0x未来标准的确切规则是什么 我并不仅仅要求具体的段落,尽管我也要求这样做(我猜是在第10节的某个地方)C++ 虚拟遗传中的优势,c++,inheritance,c++11,virtual-inheritance,C++,Inheritance,C++11,Virtual Inheritance,C++98/C++03标准和C++0x未来标准的确切规则是什么 我并不仅仅要求具体的段落,尽管我也要求这样做(我猜是在第10节的某个地方) 我也在问标准语的后果,标准语解释得很清楚。我想这就是你要找的语言。在C++03 ISO规范§10.2/2中,我们有以下内容: 下面的步骤定义类作用域C中名称查找的结果 将考虑类及其每个基类子对象中的名称。如果A是B的基类子对象,则子对象B中的成员名f隐藏子对象A中的成员名f。任何声明 那些如此隐蔽的东西被排除在考虑之外。由 using声明被认为来自C的每个子
我也在问标准语的后果,标准语解释得很清楚。我想这就是你要找的语言。在C++03 ISO规范§10.2/2中,我们有以下内容: 下面的步骤定义类作用域C中名称查找的结果 将考虑类及其每个基类子对象中的名称。如果A是B的基类子对象,则子对象B中的成员名f隐藏子对象A中的成员名f。任何声明 那些如此隐蔽的东西被排除在考虑之外。由 using声明被认为来自C的每个子对象,该子对象的类型包含using声明指定的声明。如果生成的声明集并非全部来自子对象 相同类型,或集合具有非静态成员且包含来自不同子对象的成员,则存在 模棱两可,程序格式不正确。否则,该集合就是查找的结果 在较高的层次上,这意味着当您尝试查找名称时,它会查找所有基类和类本身,以查找该名称的声明。然后按类进行操作,如果这些基本对象中有一个具有该名称的对象,它将隐藏该对象的任何基类中引入的所有名称 这里的一个重要细节是这一行: 任何声明 那些如此隐蔽的东西被排除在考虑之外 重要的是,这意味着如果某个东西被任何东西隐藏了,它就被认为是隐藏和移除的。例如,如果我这样做:
class D {
public:
void f();
}
class B: virtual public D { class C: virtual public D {
public: public:
void f(); /* empty */
}; };
class A: public B, public C {
public:
void doSomething() {
f(); // <--- This line
}
};
D类{
公众:
无效f();
}
B类:虚拟公共D{C类:虚拟公共D{
公众:公众:
void f();/*空*/
}; };
A类:公共B、公共C{
公众:
无效剂量测定法(){
f();//关于虚拟继承,你说的“支配”是什么意思?@Nicol:c++98标准的索引指的是虚拟继承,第167页。这是标准直接说的全部内容(据我所知,索引是非规范性的)。解释支配地位需要更多的时间,所以,用谷歌搜索一下,或者——如果你不知道,你可能无论如何也回答不了这个问题。干杯,@Nicol:谢谢你的提问,我添加了这个问题的链接。standardeese与奶酪有关吗?@Tomalak:这只是我的拼写方式。@Alf P.Steinbach-我刚刚用r更新了这个问题ules代表C++11,老兄,这是一个傻瓜。希望这有助于解释这一点(?)!+1。我想我现在已经理解了C++98部分。好吧。出人意料的简单。然而,当我开始阅读C++11部分时,我的眼睛变得呆滞了……干杯,+1只是为了这个答案的努力