用C ++创建接口的对象

时间:2017-02-04 21:45:16

标签: c++ object-oriented-analysis

我知道这个问题有点奇怪,但请耐心等待。

我正在为停车场设计一个OOD。我想只允许停放那些具有autopark功能的车辆。在Java中,我会创建一个接口,只允许该接口的对象(即具有autopark功能的汽车)停放。在C ++中,使用具有纯虚方法的抽象类创建接口。所以,我无法创建这个'C ++接口'的对象。那么,我如何在C ++中实现这一目标呢?

注意:我知道其他一些技巧,例如使用一些标志来表示autopark功能的存在与否等;但我对这些变通办法不感兴趣。

1 个答案:

答案 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;
};