2010-05-26 7 views
1

Y at-il une solution ou je dois garder exactement les types de classe?C++ héritage non reconnu

// fichier en-tête

Class Car { 
public: 
    Car(); 
    virtual ~Car(); 
}; 

class Bmw:Car { 
public: 
    Bmw(); 
    virtual ~Bmw(); 
}; 

void Start(Car& mycar) {}; 

// fichier cpp

Car::Car(){} 
Car::~Car() {} 

Bmw::Bmw() 
    :Car::Car(){} 
Bmw::~Bmw() {} 

int main() { 
    Car myCar; 
    Bmw myBmw; 

    Start(myCar); //works 
    Start(myBmw); //!! doesnt work 

    return 0; 
} 
+2

Pourquoi 'Start' n'est-il pas une méthode de voiture? – Johnsyweb

+0

Aussi, vous n'avez pas besoin de se référer à Car comme Car :: Car(), il est bon de se référer simplement à la voiture. 'Bmw :: Bmw(): Car() {}' est parfaitement valide. – Puppy

Répondre

14

C par défaut ++ à l'héritage privé, donc, vous devez déclarer Bmw comme:

class Bmw:public Car 

De plus, pour être tout à fait exact, vous devriez vraiment avoir Start comme méthode virtuelle de Car et de le remplacer si nécessaire dans les classes descendantes. :)

8

Vous devriez écrire class Bmw : public Car.

Ce que vous voulez avoir ici est l'héritage public, mais pas un héritage privé (qui est par défaut pour les classes dans C++).

5

Vous avez Bmw héritant privé de Car, ce qui empêche la conversion d'une référence à une référence BmwCar. Modifier la définition à:

class Bmw : public Car 
4

Vous avez besoin héritage public - il représente est une relation entre les types dérivés et de base. Comme dans bmw est une voiture, tandis que héritage privé (la valeur par défaut lorsque non explicitement spécifié et ce que vous avez ici) représente mis en œuvre en termes de relation.

Essayez:

class Bmw: public Car 
{ 
    // ... 
]; 
3

Je ne suis pas mécanicien, mais class Bmw: public Car devrais vous fixer et vous avez sur la route de l'héritage comprendre en peu de temps!

L'héritage est private par défaut pour class es (public pour struct s).