2009-05-06 2 views
1

Ich wurde in einem Interview gefragt, was ist die Verwendung von virtuellen Schlüsselwort mit einer Klassendeklaration in C++ und ich antwortete, dass virtuelle Schlüsselwort kann nicht mit einer Klassendeklaration in C++ verwendet werden. Der Interviewer sagte, dass es möglich ist und bat mich, es später zu testen.Verwendung von virtuellen Schlüsselwort mit einer Klassendeklaration

Nun, da ich es selbst überprüft habe, habe ich erfahren, dass dies möglich ist, und das ist kein Compilerfehler. In der Tat, wenn ich mit einem Visual C++ Compiler so etwas tun:

virtual class Test 
{ 
    int i; 
}; 

Ich erhalte eine Compiler-Warnung „Warnung C4091:‚virtuelle‘: ignoriert auf der linken Seite von‚Test‘, wenn keine Variable deklariert“. Ich habe noch nicht herausgefunden, was diese Warnung bedeutet und weiter, was ist die Verwendung von virtuellen Schlüsselwort. Wenn es keine hilfreiche Verwendung gibt, warum ist das überhaupt erlaubt und warum ist das kein Compilerfehler?

Antwort

6

Das ist ein Fehler in VC++. Comeau und GCC lehnen beide den Code ab.

+0

Ich wusste nicht, dass dies nicht mit anderen Compilern funktioniert. Sie sind wahrscheinlich die einzige Person, die meine Frage verstanden zu haben scheint. – Aamir

+1

Es lohnt sich immer, es auf mehr als einem Compiler auszuprobieren. Gcc ist kostenlos, und Sie können Code kostenlos auf Comeau hier ausprobieren: http://www.comeaucomputing.com/tryitout –

+2

Aamir, Sie scheinen zwei Fragen zu haben: (1) Was bedeutet der Interviewer? (2) Warum ist diese rechtliche Syntax? Ich denke, die meisten Leute haben versucht, (1) statt (2) zu antworten. – GrahamS

2

Sie können einfach nicht virtuell für eine Klasse verwenden. Es funktioniert nur für Member-Funktionen

+0

Es arbeitet mit Microsoft Visual C++ Compiler und erzeugt nur eine Warnung und keinen Fehler, wie ich bereits gesagt habe. – Aamir

+0

Sie können "virtuelle Vererbung", aber ich habe noch nie virtuelles Schlüsselwort vor Klasse – leiz

+0

@Aamir gesehen: Der VC-Compiler und in geringerem Maße g ++, sind schlechte Wahl für Compiler zu verwenden, um Ihren Code zu überprüfen. Wenn Sie für Standard-Code testen möchten, überprüfen Sie die Comeau versuchen Sie es online: http://www.comeaucomputing.com/tryitout/ –

6

virtueller kann verwendet werden, wenn sie von einer anderen Klasse abgeleitet:

class Foo : public virtual Bar 
{ 
} 

Dies verwendet wird, um mehrere Versionen der gleichen Basisklasse zu vermeiden, wenn Mehrfachvererbung. Wikipedia hat einen guten Artikel zu diesem Thema.

+1

Ich weiß definitiv über die Verwendung von virtuellen auf diese Weise. Aber schau dir mein Beispiel an, das ich in der ursprünglichen Frage gegeben habe. Ich möchte nur fragen, warum das erlaubt ist, wenn es keine Verwendung dafür gibt. – Aamir

1

Vielleicht bezog er sich auf virtuelle Vererbung/virtuelle Basisklassen? Z.B.

class A : virtual public B 
{ ... } 

Das wäre technisch Teil der Klassendefinition.

2

Sie befinden sich in der falschen Art der Nutzung suchen - ich bin ziemlich sicher, dass der Interviewer auf virtuelle Basisklasse Erklärungen bezog, etwa so:

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

Dies ist ein gemeinsames Idiom ist und verwendet um das "multiple base class" -Szenario in diamantförmigen Vererbungsbäumen zu umgehen. Das typische Problem mit ihnen ist, dass Sie sowohl von Klasse B als auch von Klasse C erben und sie den gemeinsamen Vorfahren A teilen. Wenn Sie den Vererbungsbaum "nach oben" gehen, werden Sie die Ambiguität treffen, welche Instanz von 'A' Sie sind soll verwenden. Wenn B & C stattdessen A als virtuelle Basisklasse hat, beziehen sie sich auf dieselbe Instanz von A, die dieses Problem löst.

Sie finden eine ausführlichere Beschreibung mit Klassendiagrammen here.

+1

Wie ich bereits in einem anderen Kommentar geantwortet habe, dass ich über diese Art der Verwendung sehr gut weiß und ich hatte eine gute Diskussion mit dem Interviewer über die Art der Nutzung, die Sie erwähnen. Aber er kam später dazu (die Sache, die ich gefragt habe). Es ist gut möglich, dass er das selbst nicht wusste. :) – Aamir

1

Konnte er über die Verwendung einer virtuellen Basisklasse in der Klassendeklaration sprechen?

So:

class CashierQueue : virtual public Queue {}; 

Dies wird in Mehrfachvererbung verwendet, wenn Sie eine abgeleitete Klasse mit mehreren Kopien der Mitgliederdaten vermeiden wollen, wenn es von zwei oder mehr Klassen erbt, die die gleiche Basisklasse teilen.

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

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