C++;接口-我的选择是什么? 跳回C++世界,并尝试界面。我可以在网上找到很多例子,但其中99%都是微不足道的“全部在一个文件中” 接口可以分为3种基本类型:在所有具体的子类中(所有C++)中的所有(0×0)函数都必须被重写的接口(C++中的所有纯零虚函数)。

C++;接口-我的选择是什么? 跳回C++世界,并尝试界面。我可以在网上找到很多例子,但其中99%都是微不足道的“全部在一个文件中” 接口可以分为3种基本类型:在所有具体的子类中(所有C++)中的所有(0×0)函数都必须被重写的接口(C++中的所有纯零虚函数)。,c++,interface,C++,Interface,是否可以在一个头文件中实现这3个文件中的任何一个?(不,cpp twin)为什么/为什么不?怎么用?如果没有,我的.h/.cpp对选项是什么 我看到的一些选项有:虚拟析构函数、受保护析构函数、内联析构函数、带实现的纯虚拟析构函数,。。。我头晕 编辑:意思是纯粹的虚拟,而不是虚拟的虚无阅读这篇令人敬畏的互联网智慧文章: 1) 您永远不需要.cpp文件,您可以用.h编写所有程序,但这样做是一种糟糕的风格,必然会减慢编译速度 MyClass : public MyInterface { pub

是否可以在一个头文件中实现这3个文件中的任何一个?(不,cpp twin)为什么/为什么不?怎么用?如果没有,我的.h/.cpp对选项是什么

我看到的一些选项有:虚拟析构函数、受保护析构函数、内联析构函数、带实现的纯虚拟析构函数,。。。我头晕


编辑:意思是纯粹的虚拟,而不是虚拟的虚无

阅读这篇令人敬畏的互联网智慧文章

1) 您永远不需要.cpp文件,您可以用.h编写所有程序,但这样做是一种糟糕的风格,必然会减慢编译速度

MyClass : public MyInterface {
    public:
    virtual void myFunction() {
        // override and implemenht
    }
};
2) 在继承类时,您不必担心将析构函数声明为虚拟的,但需要确保从中继承的类具有虚拟析构函数。否则,您可能会面临内存泄漏。就我所知,对于只有纯虚函数的接口类来说,这是不必要的

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

声明为void的析构函数应该会导致编译器错误:)

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

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

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

当必须重写“zero”函数时,这既不是接口也不是抽象类,它只是一个普通的旧类,您可以继承并执行任何操作

检查C++常见问题。< /P> < UL>

  • 如果将接口设置为纯虚拟接口,那么如果忘记在具体类中实现方法,编译器将给出一个错误
  • 如果有一些方法有一些健全的默认实现,您可以提供它,但这只是一种方便
  • 如果将析构函数设置为虚拟,则可以通过对象的接口指针
    删除该对象,而不需要具体的对象指针

  • Herb Sutter对与我们大多数人实现接口的方式直接不一致的接口有一些有趣的想法:

    所有函数都必须由一个具体的子类重写的接口称为
    interface

    某些函数必须由具体子类重写的接口称为
    抽象类

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

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

    。。。我头晕

    为了让它更加旋转,您还可以使用
    纯虚拟析构函数
    。当您想要抽象类,但没有真正有用的方法来放置纯虚拟类时,这是一个有用的技巧:

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

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

    我当前的玩具设置是:一个IList接口、两个实现类(Vector和LinkedLink)和一个tester类。您不需要CPP文件。。。您可以将其全部内联定义……使用“在单个头文件中实现”是什么意思?纯虚拟类(只有虚拟成员函数而没有实现的类)永远不会有.cpp…@MFH,这不是真的。在C++世界中,您仍然可以拥有由纯虚拟类实现的纯虚拟成员函数,即可以将实现放入。cpp@RomanSaveljev我说的是有意义的用法,在.cpp中有一个纯虚拟类是非常有用的。显然,该标准没有任何此类限制……至于这3种类型,我想我是想在@protocol中传递objective-c的@optional概念,它看起来好像没有等价物。@zjaquish没有,我怀疑objective-c需要这些概念的原因是动态绑定。由于C++使用编译时绑定,它将强制您实现所有未实现的方法。因此,如果我为一个函数做默认实现,最好的做法是将它拆分为.cpp文件,否则具体的类将包含所述实现(并且无法编译)。正确吗?如果将函数内联,它可以保留在标题中。否则就不行了。