Создание объекта интерфейса на C++

Я знаю, что этот вопрос немного странный, но, пожалуйста, потерпите меня.

Разрабатываю ООД для парковки. Я хочу разрешить парковку только тем транспортным средствам, в которых есть функция autopark. В Java я бы создал интерфейс, и только объекты этого интерфейса (т. е. автомобили с autopark функциями) могли бы парковаться. В C++ интерфейсы создаются с использованием абстрактных классов с чисто виртуальными методами. Итак, я не могу создавать объекты этого «интерфейса С++». Итак, как мне добиться этого на С++?

Примечание. Я знаю другие методы, такие как использование некоторого флага для обозначения наличия или отсутствия функции autopark и т. д.; но меня не интересуют эти обходные пути.


person Community    schedule 04.02.2017    source источник
comment
Вы также не можете создавать объекты типа интерфейса в Java. Там нет никакой разницы.   -  person chris    schedule 05.02.2017
comment
@chris, используя анонимный класс? Что-то вроде здесь?   -  person    schedule 05.02.2017
comment
Это создание объекта конкретного анонимного класса, реализующего интерфейс.   -  person Hovercraft Full Of Eels    schedule 05.02.2017
comment
Тег вопроса Java удален. Вы можете обсуждать Java в своем вопросе, но это все о C++.   -  person Hovercraft Full Of Eels    schedule 05.02.2017
comment
@HovercraftFullOfEels, извините. И спасибо за удаление тега.   -  person    schedule 05.02.2017
comment
Интерфейсы не могут быть созданы так же, как не могут быть созданы абстрактные классы в C++... Вам нужно наследовать от абстрактного класса, как если бы вы implement устанавливали интерфейс в Java. Применяются одни и те же вещи.   -  person Charles    schedule 05.02.2017
comment
dynamic_cast<autopark *>(address_of_some_object) дает NULL (или, в C++11 nullptr), если some_object НЕ относится к типу, производному (доступно) от autopark.   -  person Peter    schedule 05.02.2017
comment
@c650, а затем передать объекты производных классов абстрактного базового класса, поскольку они будут иметь функцию autopark, верно?   -  person    schedule 05.02.2017


Ответы (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;
};
person Qix - MONICA WAS MISTREATED    schedule 04.02.2017