cpp文件中的纯虚拟接口实现

时间:2012-12-15 10:29:43

标签: c++ header-files virtual-inheritance

将纯虚拟接口的实现放在cpp中并完全跳过头文件是不错的做法?

A.h
struct A
{
    virtual void func() = 0;
};
B.cpp
class B : public A
{
   virtual void func() override {
   ...
   }
}

1 个答案:

答案 0 :(得分:1)

有人必须使用B,他们必须从某个地方获取B的实例,即使他们只是通过A*来解决它们。所以你可以拥有例如:

A.H

struct A
{
    virtual void func() = 0;
    virtual ~A() {}
};

B.h

#include "A.h"
A *Bfactory();

B.cpp

#include "B.h"
struct B : public A { ... };
A *Bfactory() { return new B(); }

另一方面,这是一个非常“弱”的工厂函数,因为它只返回B的实例。也许在某处会有另一个工厂函数根据其参数创建A的不同派生类。该函数需要包含A.hB.hC.h等,但如果它始终使用Bfactory来创建B的实例,则它不会需要B的类定义。因此,在这种情况下,类定义仅存在于B.cpp中。

是的,我从工厂返回了一个原始指针。在现实生活中,您可能更喜欢返回unique_ptr或其他智能指针。如果这样做,那么实际上可以避免在A中需要虚拟析构函数。但我怀疑它经常值得。