наследование с ++ не распознано - PullRequest
1 голос
/ 26 мая 2010

Есть какое-то решение, или я должен точно сохранять типы классов?

// заголовочный файл

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

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

void Start(Car& mycar) {};

// cpp file

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;
}

Ответы [ 5 ]

14 голосов
/ 26 мая 2010

C ++ по умолчанию является частным наследованием, поэтому вам нужно объявить Bmw как:

class Bmw:public Car

Кроме того, чтобы быть абсолютно точным, вы должны действительно иметь Start в качестве виртуального метода Car и переопределять его по мере необходимости в классах-потомках. :)

8 голосов
/ 26 мая 2010

Вы должны написать class Bmw : public Car.

Здесь вы хотите иметь публичное наследование, но не частное (которое по умолчанию для классов в C++).

5 голосов
/ 26 мая 2010

У вас есть Bmw частное наследование от Car, что предотвращает преобразование ссылки Bmw в ссылку Car. Измените определение на:

class Bmw : public Car
4 голосов
/ 26 мая 2010

Вам необходимо публичное наследование - оно представляет IS A взаимосвязь между производным и базовым типами. Как и в bmw IS A car , в то время как личное наследование (по умолчанию, если оно не указано явно и то, что у вас здесь есть) представляет , реализованное в терминах отношения. *

Попробуйте:

class Bmw: public Car
{
    // ...
];
3 голосов
/ 26 мая 2010

Я не механик, но class Bmw: public Car должен привести вас в порядок и помочь вам быстро понять наследование!

Наследование по умолчанию private для class es (public для struct s).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...