2 Stimmen

Ist eine Definition in Klassen notwendig, die rein virtuelle Funktionen UND reguläre Funktionen haben?

Wenn Sie eine Klasse erstellen, die zum Beispiel eine rein virtuelle, aber eine oder mehrere nicht rein virtuelle Funktionen enthält, können Sie dann die Erstellung der Implementierungsdatei und damit die Definition der Klasse überspringen?

Ist dies auch der Fall, wenn es sich um eine nicht-virtuelle Funktion handelt? Ich nehme an, nein...

4voto

Philipp Punkte 45643

Sie können Klassen immer zu reinen Kopfzeilen machen, indem Sie alle Mitgliedsfunktionen inline definieren. Dies hat nichts damit zu tun, ob eine Funktion virtuell ist oder nicht. Außerdem enthält die Header-Datei fast immer bereits die Klassendefinition (es sei denn, Sie verwenden eine Forward-Deklaration).

Um die Terminologie zu klären:

Erklärung der Klasse:

class C;

Klassendefinition mit einer Mitgliedsfunktion:

class C {
  void f();
};

Klassendefinition mit einer Mitgliedsfunktion, die inline definiert ist:

class C {
  void f() { ... }
};

Alle drei Arten sind möglich und in verschiedenen Situationen nützlich. Bei Klassenvorlagen verwenden Sie häufig den dritten Stil, um beliebige Instanziierungen zu ermöglichen. Für gewöhnliche Klassen mit viel Code ist der zweite Stil vorherrschend, da er die Größe des Objektcodes und die Kompilierzeit reduziert.

1voto

Alecs Punkte 2206

Solange Sie keine Mitglieder aufrufen, brauchen Sie deren Deklarationen nicht zu haben, selbst wenn Ihre Klasse nicht abstrakt ist.

ist es eine gute Möglichkeit, einige Operatoren zu verbieten - machen Sie sie privat und ohne Deklaration, um sicher zu sein, dass dieser Operator nicht mit dieser Klasse verwendet wird.

0voto

Abhineet Punkte 6299

Sie sollten keine Definition für eine rein virtuelle Funktion in der Basisklasse erstellen, aber Sie sollten eine Definition für eine reguläre Funktion erstellen. Eine rein virtuelle Methode in der Basisklasse zu definieren, macht keinen Sinn.

Auch wenn eine Klasse eine abstrakte Klasse ist (d.h. wenn sie aus einer rein virtuellen Funktion besteht), muss sie vererbt werden. Wir können auch kein Objekt für eine abstrakte Klasse erstellen.

Bearbeiteter Teil:

class A{
public:
    int a;

    virtual void vDisplay() = 0; //Should not be defined in base class and must be defined in the derived class
    virtual int vGet(); //non pure Virtual function 
    void vSetA(int x); //non virtual member function must be defined
};
class B:public A{
    int b;
public:
    void vDisplay(); //should be defined in derived class
    int vGet();
    void vSetB(int x,int y);
};
int A::vGet(){
    return a;
}
void A::vSetA(int x){
    a = x;
}
void B::vDisplay(){
    cout<<"a="<<a<<"b="<<b;
}
int B::vGet(){
    return a;
}
void B::vSetB(int x, int y){
    a = x;
    b = y;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X