2016-04-03 91 views
-1

,如果我要創建我有這個基類C++ - 從抽象對象創建非抽象對象

class Object { 
... 
public: 
    virtual void move() = 0; 
    virtual void move(string) = 0; 
    virtual void powerOn() = 0; 
    virtual void powerOff() = 0; 
    virtual void speak() = 0; 
}; 

這將是不同類

class Electronics : public Object { 
... 
public: 
    virtual void powerOn(); 
    virtual void powerOff(); 
}; 

void Electronics::powerOn() { ... } 
void Electronics::powerOff() { ... } 

class Phone : public Electronics { 
... 
public: 
}; 

基類現在,一個對象Phone,它使用powerOn()和powerOff()方法。我不需要其他三種方法。

Object *obj = new Phone; 

但是,這可能會給我一個錯誤說

undefined reference to move() 
undefined reference to move(string) 
undefined reference to speak() 

我的問題是,如何避免這個錯誤。我不需要這些Phone的功能,但它需要我對他們做些什麼。我怎麼能通過這個錯誤?

感謝

+0

你可以從Object中刪除這些函數,並在你真正需要它們的較低的子類中使用它們 – Pooya

+0

我需要稍後做類似以下操作:Object * phone = new Phone。然後,當我打電話給phone-> powerOn()時,它會說Object類 –

回答

0

您可以提供空實現在任一ElectronicsObject這些虛擬方法(使非方法摘要)。或者如果兩者都需要這樣,你需要在Phone中重新實施它們。但是,您不能將它們「隱藏」在Phone中,除非您將它們從其底座上移除。

+0

中沒有powerOn()方法對不起,但是你的意思是「空實現」 –

+0

@thisisalongdisplayname正如TommyA提到的,空實現是一個空體的函數/方法,例如foo(){} – Resurrection

0

如前所述,您可以在Electronics類中創建它們的空實現,換句話說就是覆蓋此類中的方法,並簡單地讓它有一個空的主體。 (見這裏的例子:http://ideone.com/jM2hX7

#include <iostream> 
using namespace std; 

class Object { 
public: 
    virtual void move() = 0; 
    virtual void move(string) = 0; 
    virtual void powerOn() = 0; 
    virtual void powerOff() = 0; 
    virtual void speak() = 0; 
}; 

class Electronics : public Object { 
public: 
    virtual void move() override {} 
    virtual void move(string) override {} 
    virtual void powerOn() override {cout << "powerOn" << endl;} 
    virtual void powerOff() override {cout << "powerOff" << endl;} 
    virtual void speak() override {} 
}; 

class Phone : public Electronics { 
    virtual void powerOn() override {cout << "phone:powerOn" << endl;} 
    virtual void powerOff() override {cout << "phone:powerOff" << endl;} 
}; 

int main() { 
    Object* phone = new Phone; 

    phone->move(); 
    phone->powerOn(); 
    phone->powerOff(); 
    phone->speak();  

    delete phone; 
    return 0; 
} 

輸出:

phone:powerOn 
phone:powerOff 

更重要的是,你可能要重新考慮你的類的設計,是不是真的需要有純虛方法,如powerOnpowerOffspeak,...在你的課堂上:Object。對象聽起來很普通,而這些功能聽起來更具體。 Object理想情況下應該只包含對所有繼承它的類都有意義的函數。

這些函數在Electronics類中可能更有意義,儘管即使這樣,似乎也有點過於籠統。

如果確實需要在Object類中包含這些對象,那麼我會親自將其重命名爲更多的說法。

+0

是的,但是當我這樣做時:Object * phone = new Phone,並且在稍後的一點呼叫phone> powerOn()時,它會說對象類沒有方法稱爲powerOn() –

+0

@thisisalongdisplayname why如果你已經實施了'powerOn'方法,就像你在'Electronics'類中一樣? –

+0

由於Phone是對象類型,當我調用pwerOn()時,它將在Object類中查找powerOn()。這是不對的? –