Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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
使用带有类声明的virtual关键字 我在一次采访中被问到,在C++中使用类声明的虚拟关键词的用法是什么?我回答说,虚拟关键字不能用于C++中的类声明。面试官说这是可能的,并让我稍后测试_C++_Virtual - Fatal编程技术网

使用带有类声明的virtual关键字 我在一次采访中被问到,在C++中使用类声明的虚拟关键词的用法是什么?我回答说,虚拟关键字不能用于C++中的类声明。面试官说这是可能的,并让我稍后测试

使用带有类声明的virtual关键字 我在一次采访中被问到,在C++中使用类声明的虚拟关键词的用法是什么?我回答说,虚拟关键字不能用于C++中的类声明。面试官说这是可能的,并让我稍后测试,c++,virtual,C++,Virtual,现在我已经亲自检查过了,我知道这是可能的,这不是一个编译器错误。事实上,当我用VisualC++编译器做这样的事情: virtual class Test { int i; }; 我得到一个编译器警告“warning C4091:'virtual”:当没有声明变量时,“Test”左侧被忽略。我还没有发现这个警告意味着什么,以及虚拟关键词的用法。如果没有有用的用法,那么为什么首先允许这样做,为什么这不是一个编译器错误。您不能对类使用virtual。它只适用于成员函数您不能将虚拟函数用于类。

现在我已经亲自检查过了,我知道这是可能的,这不是一个编译器错误。事实上,当我用VisualC++编译器做这样的事情:

virtual class Test
{
   int i;
};

我得到一个编译器警告“warning C4091:'virtual”:当没有声明变量时,“Test”左侧被忽略。我还没有发现这个警告意味着什么,以及虚拟关键词的用法。如果没有有用的用法,那么为什么首先允许这样做,为什么这不是一个编译器错误。

您不能对类使用virtual。它只适用于成员函数

您不能将虚拟函数用于类。它仅适用于成员函数

虚拟从其他类派生时可以使用:

class Foo : public virtual Bar
{
}

这用于避免在使用多重继承时具有同一基类的多个版本。有一篇关于这个主题的好文章。

当从另一个类派生时,可以使用virtual

class Foo : public virtual Bar
{
}

这用于避免在使用多重继承时具有同一基类的多个版本。有一篇关于这个主题的好文章。

也许他指的是虚拟继承/虚拟基类?例如

class A : virtual public B
{ ... }

这在技术上是类定义的一部分。

也许他指的是虚拟继承/虚拟基类?例如

class A : virtual public B
{ ... }

从技术上讲,这是类定义的一部分。

您看到的是一种错误的用法-我很确定采访者指的是虚拟基类声明,如下所示:


A类:虚拟公共B、公共C{
...
};

这是一个常见的习惯用法,用于绕过菱形继承树中的“多基类”场景。它们的典型问题是,您同时从类B和类C继承,并且它们共享共同的祖先A。如果您“向上”继承树,您将遇到关于应该使用哪个“A”实例的歧义。如果B&C将A作为虚拟基类,它们将引用A的同一个实例,这就解决了这个问题


您可以在类图中找到更详尽的描述。

您看到的是错误的用法-我很确定采访者指的是虚拟基类声明,如下所示:


A类:虚拟公共B、公共C{
...
};

这是一个常见的习惯用法,用于绕过菱形继承树中的“多基类”场景。它们的典型问题是,您同时从类B和类C继承,并且它们共享共同的祖先A。如果您“向上”继承树,您将遇到关于应该使用哪个“A”实例的歧义。如果B&C将A作为虚拟基类,它们将引用A的同一个实例,这就解决了这个问题


您可以在类图中找到更详尽的描述。

这是VC++中的一个错误。Comeau和gcc都拒绝该代码。

这是VC++中的一个bug。Comeau和gcc都拒绝该代码。

他可能在类声明中提到使用虚拟基类吗

像这样:

class CashierQueue : virtual public Queue {};
当希望避免派生类从共享同一基类的两个或多个类继承时具有成员数据的多个副本时,可以在多重继承中使用此选项

class Queue {};
class CashierQueue : virtual public Queue {};
class LunchQueue : virtual public Queue {};
class LunchCashierQueue : public LunchQueue, public CashierQueue {};

请参见

他是否在类声明中提到使用虚拟基类

像这样:

class CashierQueue : virtual public Queue {};
当希望避免派生类从共享同一基类的两个或多个类继承时具有成员数据的多个副本时,可以在多重继承中使用此选项

class Queue {};
class CashierQueue : virtual public Queue {};
class LunchQueue : virtual public Queue {};
class LunchCashierQueue : public LunchQueue, public CashierQueue {};

它与微软Visual C++编译器一起工作,只生成警告而不是错误,我已经说过了。你可以“虚拟继承”,但我以前从未见过虚拟关键词。class@Aamir:VC编译器,以及较小的扩展g++,对于编译器来说,用于验证代码的选择很差。如果你想测试标准代码,请检查COMUE在线试用:它与微软Visual C++编译器一起工作,只生成警告而不是错误,我已经说过了。你可以“虚拟继承”,但我以前从未见过虚拟关键词。class@Aamir:VC编译器,在较小的范围内扩展为g++,对于编译器来说,用于验证代码的选项很差。如果您想测试标准代码,请查看Comeau在线试用:我肯定知道如何以这种方式使用虚拟机。但请看我在原始问题中给出的示例。我只是想问,如果没有使用它,为什么允许这样做。我肯定知道如何用这种方式使用虚拟机。但请看我在原始问题中给出的示例。我只是想问,如果没有使用它,为什么允许这样做。我不知道这不适用于其他编译器。你可能是唯一一个似乎理解我的问题的人。总是值得在多个编译器上尝试。Gcc是免费的,你可以在Comeau上免费试用代码:Aamir,你似乎有两个问题:(1)面试官的意思是什么?(2) 为什么这是合法的语法?我认为大多数人都试图回答(1)而不是(2)。是的,我认为你是对的。也许我问这个问题时不够清楚。无论如何,我现在已经停止回复与(1)相关的答案。我不知道这对其他编译器不起作用。你可能是唯一一个似乎理解我的问题的人。总是值得在多个编译器上尝试。Gcc是免费的,您可以尝试代码o