回到C ++世界,尝试接口。我可以找到很多在线示例,但其中99%都是微不足道的“一体化文件”。
接口可以分为3种基本类型 - 接口,其中(all | some | zero)函数必须在具体子类中重写(c ++用语中的所有|零|纯虚函数)。
是否可以在单个头文件中实现3中的任何一个? (没有.cpp双胞胎)为什么/为什么不呢?怎么样?如果没有,我对.h / .cpp对的选择是什么?
我看到的一些选项是:虚析构函数,受保护的析构函数,内联析构函数,带实现的纯虚析构函数,......我的脑袋正在旋转!
编辑:意味着纯虚拟,而非虚拟空白
答案 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()。这就是你必须实现它的原因