C ++接口 - 我的选择是什么?

时间:2012-08-09 19:56:00

标签: c++ interface

回到C ++世界,尝试接口。我可以找到很多在线示例,但其中99%都是微不足道的“一体化文件”。

接口可以分为3种基本类型 - 接口,其中(all | some | zero)函数必须在具体子类中重写(c ++用语中的所有|零|纯虚函数)。

是否可以在单个头文件中实现3中的任何一个? (没有.cpp双胞胎)为什么/为什么不呢?怎么样?如果没有,我对.h / .cpp对的选择是什么?

我看到的一些选项是:虚析构函数,受保护的析构函数,内联析构函数,带实现的纯虚析构函数,......我的脑袋正在旋转!

编辑:意味着纯虚拟,而非虚拟空白

3 个答案:

答案 0 :(得分:1)

  • 如果您将接口设置为纯虚拟,如果您忘记在具体类中实现方法,编译器将会出错。
  • 如果有方法有一些理智的默认实现,你可以提供它,但这只是一个方便。
  • 如果你将析构函数设为虚拟,你可以通过它的接口指针delete来对象,而不需要具体的对象指针。

Herb Sutter对接口有一些有趣的想法,这与我们大多数人实现接口的方式直接相关:http://www.gotw.ca/publications/mill18.htm

答案 1 :(得分:0)

阅读这篇令人敬畏的互联网智慧http://www.parashift.com/c++-faq-lite/dtors.html

1)你永远不需要一个.cpp文件,你可以在.h中编写所有程序的代码,但这样做的风格很糟糕,并且不可避免地会减慢你的编译速度。

MyClass : public MyInterface {
    public:
    virtual void myFunction() {
        // override and implemenht
    }
};

2)继承类时,您不必担心声明析构函数是虚拟的,但您需要确保继承的类具有虚拟析构函数。否则您可能会面临内存泄漏。据我所知,对于只有纯虚函数的接口类来说,这不是必需的。

内联析构函数对你没有任何影响。

声明为void的析构函数应该会给你一个编译错误:)。

编辑: 关于3种类型的界面,我感觉你有点困惑,这妨碍了你的谷歌搜索。

接口通常是没有定义函数的类,您必须继承并实现所有这些。

具有某些功能但仍具有一些纯虚拟的类通常称为抽象。

当必须覆盖'zero'函数时,这既不是接口也不是抽象类,它只是一个普通的旧类,你可以继承并做任何事情。

查看C ++常见问题。

答案 2 :(得分:0)

必须由具体子类覆盖所有函数的接口称为interface

必须由具体子类覆盖某些函数的接口称为abstract class

必须由具体子类覆盖零函数的接口称为class

您可以在头文件中实现虚拟成员函数。但它们不会内联,因为它们必须将地址放入虚拟表中。

  

......我的头在旋转!

为了让它更加旋转,您还可以拥有pure virtual destructor。当你想要抽象类时,这是一个很有用的技巧,但没有真正有用的方法来放置纯虚拟:

class A
{
public:
    virtual ~A() = 0;
};

A::~A() {}

class B : public A
{
public:
    ~B() {}
};

A类已经实现了析构函数,但它仍然无法直接实例化,因为它是接口。然而,当涉及到销毁B时,编译器必须遵守协议并调用~A()。这就是你必须实现它的原因