1

我在一次采访中被问到在 C++ 中使用类声明的虚拟关键字有什么用,我回答说虚拟关键字不能与 C++ 中的类声明一起使用。面试官说有可能,让我稍后测试一下。

现在我自己检查过了,我知道这是可能的,这不是编译器错误。事实上,当我用 Visual C++ 编译器做这样的事情时:

virtual class Test
{
   int i;
};

我收到一个编译器警告“警告 C4091:'virtual':当没有声明变量时,'Test' 左侧被忽略”。我还没有弄清楚这个警告的含义以及 virtual 关键字的用法。如果没有有用的用法,那么为什么首先允许这样做,为什么这不是编译器错误。

4

6 回答 6

6

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

class Foo : public virtual Bar
{
}

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

于 2009-05-06T09:57:46.670 回答
6

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

于 2009-05-06T09:59:30.770 回答
2

您根本不能将 virtual 用于类。它仅适用于成员函数

于 2009-05-06T09:54:26.180 回答
2

您正在查看错误的用法-我很确定面试官指的是虚拟基类声明,如下所示:

  class A : virtual public B, public C {
    ...
  };

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

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

于 2009-05-06T09:58:23.423 回答
1

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

class A : virtual public B
{ ... }

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

于 2009-05-06T09:58:18.587 回答
1

他可能一直在谈论在类声明中使用虚拟基类吗?

像这样:

class CashierQueue : virtual public Queue {};

当您希望避免派生类从两个或多个共享相同基类的类继承时,它会在多重继承中使用成员数据的多个副本。

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

请参阅http://msdn.microsoft.com/en-us/library/wcz57btd(VS.80).aspx

于 2009-05-06T10:03:17.483 回答