2010-05-26 105 views
1

有沒有一些解決方案,或者我必須保持準確的類類型?不承認C++繼承

//頭文件

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

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

void Start(Car& mycar) {}; 

// 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

爲什麼「開始」不是汽車的一種方法? – Johnsyweb 2010-05-26 12:46:58

+0

此外,您不需要將汽車稱爲Car :: Car(),將它稱爲Car就可以。 'Bmw :: Bmw():Car(){}'是完全有效的。 – Puppy 2010-05-30 19:21:13

回答

14

C++默認爲私有繼承,因此,你需要聲明寶馬爲:

class Bmw:public Car 

而且,是完全正確的,你要真有Start爲虛方法的Car並根據需要在後代類中覆蓋它。 :)

8

你應該寫class Bmw : public Car

你想在這裏得到的是公有繼承,但不是私有繼承(這是C++中類的默認值)。

5

您有Bmw私自從Car繼承,它可以防止將Bmw引用轉換爲Car引用。定義更改爲:

class Bmw : public Car 
4

您需要公有繼承 - 它代表IS A派生類型和基類型之間的關係。如bmw IS A汽車,而私有繼承(默認情況下,當沒有明確指定和你在這裏有什麼)代表代表執行的關係。

嘗試:

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

我不是機械師,但class Bmw: public Car應該修正你和有你的道路上,以在任何時間瞭解繼承!

默認情況下,privateclass es(publicstruct s)。