2016-04-03 98 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()。这是不对的? –