我知道这个问题有点奇怪,但请耐心等待。
我正在为停车场设计一个OOD。我想只允许停放那些具有autopark
功能的车辆。在Java中,我会创建一个接口,只允许该接口的对象(即具有autopark
功能的汽车)停放。在C ++中,使用具有纯虚方法的抽象类创建接口。所以,我无法创建这个'C ++接口'的对象。那么,我如何在C ++中实现这一目标呢?
注意:我知道其他一些技巧,例如使用一些标志来表示autopark
功能的存在与否等;但我对这些变通办法不感兴趣。
答案 0 :(得分:3)
您正在寻找一种创建匿名具体类的方法。
在C ++中,您可以通过将结构/类视为变量声明的“类型”来创建匿名结构。下面,我们有实现类(注意它是匿名的,但仍然扩展Foo
,我们的纯虚拟/'抽象'基类)而不是以分号结尾,我们给它一个变量名来立即分配一个堆栈上该匿名类的实例。
因此,这就是为什么C和C ++中的类,结构和枚举必须以分号结尾的原因(而namespace
之类的东西不能)。
#include <iostream>
using namespace std;
class Foo {
public:
virtual void bar() = 0;
};
void callBar(Foo *foo) {
foo->bar();
}
int main() {
class : public Foo {
virtual void bar() {
cout << "Hello from foo1" << endl;
}
} foo1; // <-- Note that we immediately create foo1 here...
class : public Foo {
virtual void bar() {
cout << "Bonjour from foo2" << endl;
}
} foo2; // <-- ... and foo2 here.
callBar(&foo1);
callBar(&foo2);
return 0;
};