我在接受采访时被问及在C ++中使用带有类声明的virtual关键字是什么,我回答说虚拟关键字不能与C ++中的类声明一起使用。面试官说这是可能的,并让我稍后进行测试。
现在我已经自己检查过了,我已经知道这是可能的,这不是编译器错误。事实上,当我使用Visual C ++编译器执行此类操作时:
virtual class Test
{
int i;
};
我收到编译器警告“警告C4091:'virtual':当没有声明变量时,在'Test'的左边忽略”。我还没有发现这个警告意味着什么,以及虚拟关键字的用法是什么。如果没有有用的用法,那么为什么首先允许这样做,为什么这不是编译器错误。
答案 0 :(得分:6)
虚拟:
class Foo : public virtual Bar
{
}
这用于避免在使用多重继承时具有相同基类的多个版本。 Wikipedia有一篇关于这个主题的好文章。
答案 1 :(得分:6)
这是VC ++中的一个错误。 Comeau和gcc都拒绝代码。
答案 2 :(得分:2)
你根本无法在课堂上使用虚拟。它仅适用于成员函数
答案 3 :(得分:2)
你正在寻找错误的用法 - 我很确定访问者是指虚拟基类声明,如下所示:
class A : virtual public B, public C {
...
};
这是一个常见的习惯用法,用于绕过菱形继承树中的“多基类”场景。它们的典型问题是你继承了B类和C类,并且它们共享共同的祖先A.如果你“继承”继承树,你就会明白你是哪个“A”实例的模糊性应该用。如果B& C将A作为虚拟基类,它们将引用相同的A实例,从而解决了这个问题。
您可以使用类图here找到更详尽的描述。
答案 4 :(得分:1)
也许他指的是虚拟继承/虚拟基类? E.g。
class A : virtual public B
{ ... }
从技术上讲,这将是课程定义的一部分。
答案 5 :(得分: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