1
651
扩展答案 bradtgmurray ,您可能希望通过添加虚拟析构函数对接口的纯虚拟方法列表进行一次异常。这允许您将指针所有权传递给另一方,而不公开具体的派生类。析构函数不必做任何事情,因为接口没有任何具体的成员。将函数定义为虚函数和内联函数似乎是矛盾的,但请相信我,事实并非如此。
您不必为虚拟析构函数包含主体-事实证明,有些编译器在优化空析构函数时遇到问题,最好不要使用默认值。 |
2
230
用纯虚拟方法生成类。通过创建另一个重写这些虚拟方法的类来使用接口。 纯虚方法是一个类方法,它被定义为虚方法并分配给0。
|
3
140
除了C中的抽象基类之外,还有一个特殊的接口类型类别的全部原因#/ Java 是因为c/j/java不支持多重继承。 C++支持多重继承,因此不需要特殊类型。一个抽象的基类,没有非抽象(纯虚拟)方法在功能上相当于一个C/J/Java接口。 |
4
46
C++中没有“接口”本身的概念。AFIK,首先在Java中引入接口,以解决缺乏多重继承的问题。这个概念被证明是非常有用的,并且在C++中通过使用抽象基类可以实现同样的效果。 抽象基类是一个类,其中至少一个成员函数(Java LINGO方法)是使用以下语法声明的纯虚函数:
无法实例化抽象基类,即不能声明类A的对象。只能从派生类,但任何不提供
请注意,抽象基类可以不仅仅是接口,因为它可以包含非纯虚拟的数据成员和成员函数。一个接口的等价物将是一个没有任何数据的抽象基类,只有纯虚拟函数。 而且,正如MarkRansom指出的那样,抽象基类应该为此提供一个虚拟析构函数,就像任何基类一样。 |
5
41
就我所能测试的而言,添加虚拟析构函数是非常重要的。我使用的对象是
如果不在接口中添加虚拟析构函数,则不会调用继承类的析构函数。
如果运行前一个代码时没有
|
6
31
我的回答与其他人基本相同,但我认为还有两件重要的事情要做:
和其他答案一样:
|
7
10
在C++ 11中,您可以完全避免继承:
在这种情况下,接口具有引用语义,即必须确保对象比接口长(也可以使用值语义创建接口)。 这些类型的接口有其优缺点:
最后,继承是复杂软件设计中万恶之源。在 Sean Parent's Value Semantics and Concepts-based Polymorphism (强烈推荐,这里解释了此技术的更好版本)研究了以下情况:
假设我有一个应用程序,其中我使用
在应用程序中,使用
现在假设您想使用我在应用程序中开发的一些形状。从概念上讲,我们的形状具有相同的界面,但要使我的形状在您的应用程序中工作,您需要将我的形状扩展如下:
首先,修改我的形状可能根本不可能。此外,多重继承导致了通往意大利面条代码的道路(假设第三个项目是使用
更新:关于非继承的多态性有几个新的参考:
|
8
9
以上都是好答案。 你应该记住一件额外的事情——你也可以有一个纯粹的虚拟析构函数。唯一的区别是您仍然需要实现它。 困惑的?
您希望这样做的主要原因是,如果您像我一样希望提供接口方法,但是使覆盖它们成为可选的。 要使类成为接口类,需要纯虚方法,但所有虚方法都有默认实现,因此唯一剩下的纯虚方法是析构函数。 在派生类中重新实现一个析构函数一点也不重要——我总是在派生类中重新实现一个析构函数,不管是虚拟的还是非虚拟的。 |
9
7
如果你使用微软的C++编译器,那么你可以做到以下几点:
我喜欢这种方法,因为它会导致更小的接口代码,并且生成的代码大小可以明显更小。使用novtable将删除该类中对vtable指针的所有引用,因此您永远不能直接实例化它。请参阅此处的文档- novtable . |
10
4
除了上面写的内容: 首先,确保析构函数也是纯虚拟的 第二,在实现时,您可能希望实际上(而不是通常)继承,只是为了好的度量。 |
11
4
您还可以考虑使用Nvi(非虚拟接口模式)实现的契约类。例如:
|
12
1
在C++开发中,我还是新手。我从Visual Studio(vs)开始。
然而,似乎没有人提到
如果有人对此有兴趣,请分享。-) 谢谢。 |
13
0
虽然这是真的
这样做的好处是,您可以重新绑定事件运行时而不必重新构建类(因为C++没有改变多态类型的语法,这是变色龙类的一种解决方法)。 提示:
|
14
0
以下是对
N468 3.4.2
|
15
-2
结果: 矩形面积:35 三角形区域:17 我们已经看到一个抽象类是如何用getArea()定义一个接口的,另外两个类实现了相同的函数,但是使用不同的算法来计算特定于形状的区域。 |
Brendan · Java中从父类继承的对象的ArrayList 2 年前 |
Tali · 继承-您应该使用基类,还是它们只是子类的框架? 2 年前 |
mask2 · 如何轻松访问继承类的功能? 2 年前 |
Dimon · 父类中的Setter,以及一些没有参数的子类 2 年前 |
Miguerurso · Javascript类继承无法正常工作 2 年前 |
GuessMe · 返回新类对象的正确方法(也可以扩展) 2 年前 |
Daniel Lizik · 重写父类构造函数的子类成员初始值设定项 2 年前 |
i_know_what · 以基类作为参数重写错误的方法 2 年前 |