Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 虚拟遗传中的优势_C++_Inheritance_C++11_Virtual Inheritance - Fatal编程技术网

C++ 虚拟遗传中的优势

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++98/C++03标准和C++0x未来标准的确切规则是什么

我并不仅仅要求具体的段落,尽管我也要求这样做(我猜是在第10节的某个地方)


我也在问标准语的后果,标准语解释得很清楚。

我想这就是你要找的语言。在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只是为了这个答案的努力