2015-08-03 111 views
2

函数返回指向抽象类的指针是否有意义?返回指向抽象类的指针的C++函数

+3

当然。例如,一个班级工厂通常会这样做。 – rodrigo

+0

例如,如果你有一个std :: vector 成员,并且一个Get函数返回一个Base * ... Base可以是抽象的...所以基本上,当你使用多态或pimpl习语时它是有意义的 – Melkon

+0

@ Melkon:在这方面,pimpl如何相关? –

回答

12

当然,这就是多态性的要点:传递和使用指向抽象类的指针,而不管具体实现是什么。

其中,Factory Pattern通常返回一个指向抽象类的指针。

1

是的它确实有道理。
这就像使用接口。

1

排序假设您有一个名为AClass的抽象类,具体实现名为CClass。您可以返回指向CClass的实例的指针,该实例的类型可以是AClass*CClass*。但是,由于无法实例化抽象类,因此无法返回指向抽象类的实例的指针。

但是,如果您返回AClass*,您的客户端将只能访问AClass的接口;如果他们想要访问CClass功能没有包含在AClass的界面中,他们需要将指针指向CClass*

3

是的,操作指向抽象类的指针(或引用)是有意义的,以便将接口从实际实现中分离出来并利用polymorphism的好处。

但要注意的是,如果该功能是负责分配返回的对象(某种factory)的,请务必使用一个虚拟的析构函数,以便能够从抽象类的指针正确地删除对象:

class Base { 
    public: 
    virtual ~Base() {} 
}; 

class Derived : public Base { 
    public: 
    ~Derived() override { 
     // Do some important cleanup 
    } 
}; 

Base* factory() { 
    return new Derived; 
} 

Base* base = factory(); 
base->~Base(); // calls Derived::~Derived 

如果没有Base的虚拟析构函数,则不会调用Derived的析构函数。