c++ - cpp文件中的纯虚接口(interface)实现

标签 c++ header-files virtual-inheritance

将纯虚拟接口(interface)的实现放在cpp中并完全跳过头文件是否是一种好的做法?

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

最佳答案

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

啊啊

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 中对虚拟析构函数的需要。但我怀疑这通常是否值得。

关于c++ - cpp文件中的纯虚接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13891394/

相关文章:

c++ - 修改 VS 2012 C++ 头模板

C++ 无法通过虚拟基 A 从基 A 转换为派生类型 B

c++ - 了解虚拟继承类 vtables 和 vptr 创建

ios - 为什么 View Controller 的头文件中需要一个 Action 方法声明?

c++ - 混合基类的虚拟和非虚拟继承

c++ - g++ 无法链接共享对象的静态版本

c++ - 如何将 "shebang"文件的内容提供给它调用的程序?

c++ - 使用 mysql 连接器将 mysql 数据库中的数据存储到 C++ 变量中

c++ - Windows 和 Linux 的 C++ Qt 头文件是否相同?

c - 在 ArchLinux 中包含 "<uapi/..>"目录的正确方法是什么?