2017-05-29 2 views
-5

J'utilise une méthode pure virtuelle comme indiqué dans le code ci-dessous.Pourquoi cette méthode virtuelle pure ne compile-t-elle pas?

#include <iostream> 
using namespace std; 
class Advertisment 
{ 
public: 
    vitual void price (int Uchrg, int no_of_unt) = 0; 
    { 
    } 
}; 

class TVadvertisment : public Advertisment 
{ 
public: 
    void price (int Uchrg, int no_of_unt) 
    { 
     int adPrice = Uchrg * no_of_unt; 
     cout << "Advertisment Price: " << adPrice; 
    } 
}; 

int main() 
{ 
    TVadvertisment T; 
    T.price(1000, 60); 
    return 0; 
} 

Comme je sais une fonction virtuelle pure sera déclarée comme virtual void display() = 0;. Mais le compilateur Code :: Blocks affiche une erreur à cause de cela = 0. Sans cela, il compilera avec succès.

Et aussi je n'ai pas utilisé de pointeurs pour appeler des méthodes de classe dérivée.

+0

S'il vous plaît [modifier] votre question pour fournir un [mcve] * dans la question elle-même *. –

+0

_J'utilise Pure Virtual comme ci-dessous. ** Copier-coller ** tout le code pertinent dans la question elle-même. –

+2

S'il vous plaît ne pas lier les images de texte, il suffit de copier et coller les informations pertinentes dans votre question. – Rook

Répondre

1

Votre fonction est purement virtuelle, ce qui signifie que la méthode est virtuelle et n'est même pas implémentée dans la classe de base (= 0). Vous devez donc supprimer le bloc après.

Il doit être:

virtual price(int Uchrg, int no_of_unt) = 0; 

sans { }.

Signifie que les classes qui héritent d'une classe de base peuvent remplacer la méthode et être appelées via l'interface de classe de base. Si une classe a une méthode virtuelle pure, la classe est abstraite et cette fonction doit être surchargée par les classes qui héritent de cette classe de base à instancier.

En bref:

virtuel:

virtual price(int Uchrg, int no_of_unt) 
{ 
    // Implementation 
} 

Est-ce qu'une mise en œuvre est la classe de base. Les sous-classes ne doivent pas remplacer, mais ils le peuvent. La classe n'est pas abstraite et peut être instanciée.

virtuelle pure:

virtual price(int Uchrg, int no_of_unt) = 0; // No implementation 

Il n'y a pas mise en œuvre, les sous-classes doivent remplacer cette ne pas être abstraite.

Appel d'une méthode virtuelle via la classe de base:

Base* pBase = new Derived; 
pBase->fun(); 

La méthode est appelée via l'interface de la classe de base, mais il sera la méthode de la classe dérivée.