【问题标题】:Creating an object of an interface in C++在 C++ 中创建接口的对象
【发布时间】:2017-02-04 21:45:16
【问题描述】:

我知道这个问题有点奇怪,但请多多包涵。

我正在为停车场设计 OOD。我只想让那些具有autopark 功能的车辆停放。在 Java 中,我会创建一个接口,并且只允许该接口的对象(即具有autopark 功能的汽车)停放。在 C++ 中,接口是使用带有纯虚方法的抽象类创建的。因此,我无法创建此“C++ 接口”的对象。那么,我如何在 C++ 中实现这一点?

注意:我知道其他技术,例如使用某些标志来表示 autopark 功能的存在或不存在等;但我对这些解决方法不感兴趣。

【问题讨论】:

  • 您也不能在 Java 中创建接口类型的对象。没有区别。
  • @chris,使用匿名类? here 之类的东西?
  • 那是创建一个实现接口的具体匿名类的对象。
  • Java 问题标签已移除。您可能在您的问题中讨论 Java,但这完全是关于 C++。
  • @HovercraftFullOfEels,对不起。并感谢您删除标签。

标签: c++ object-oriented-analysis


【解决方案1】:

您正在寻找一种创建匿名具体类的方法。

在 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;
};

【讨论】:

    猜你喜欢
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2013-02-06
    相关资源
    最近更新 更多