2009-10-15 10 views
-2
class base 
{ 
    base() { } 
    virtual ~base() { } 
} 

class middleBase 
{ 
    middleBase() { } 
    middleBase (int param) { } 
    ~middleBase() { } 
} 

class concrete : public middleBase 
{ 
    concrete() { } 
    concrete (int param) { // process } 
    ~concrete() { // delete something } 
} 

erreur est: référence undefinded à "middleBase :: middleBase (int param)"C++ construction abstraite de la classe et la destruction

et est-ce approprié pour les meilleures pratiques pour les constructeurs paramétrés?

+1

Cela ne devrait pas compiler. –

+2

S'il vous plaît poster le code réel avec lequel le problème est reproductible .. il ya plusieurs problèmes avec ce code comme manquant; pour les classes, middleBase n'est pas dérivé de la base, le destructeur middleBase n'est pas virtuel, les spécificateurs d'accès manquants, etc. – Naveen

Répondre

8
class base 
{ 
    public: // constructor should be accessible by derived class 
    base() { } 
    virtual ~base() { } 
}; // add semicolon 

class middleBase : public base // you missed the declaration 
{ 
    public: 
    middleBase() { } 
    middleBase (int param) { } 
    virtual ~middleBase() { } 
}; 

class concrete : public middleBase 
{ 
    public: 
    concrete() { } 
    concrete (int param) : middleBase(param) { /* process */ } 
    virtual ~concrete() { /* delete something */ } 
}; 
3

C++ a besoin des points-virgules après les définitions de classe:

class { … }; 
0

Si vous ne spécificateur met pas d'accès (public/privé/protégé) avant que les fonctions de membres de la classe ou variables, la valeur par défaut est private spécificateur pour Classes C++ Le constructeur de middleBase est donc privé et ne peut pas être accédé par le constructeur de la classe concrete, provoquant l'erreur que vous avez mentionnée.

Questions connexes