Как объявить абстрактные классы в с ++ - PullRequest
1 голос
/ 21 ноября 2019

Изучив Java, я смущен тем, как объектная ориентация реализована в C ++.

Имея этот класс:

class Car {
    int weight;
public:
    Car(int input) {
        weight = input;
    }
    void sayVroem() {
        std::cout << "Vroem...";
    }
};

В Java я мог бы объявить это абстрактнымкласс, объявив его как public abstract class Car. Это приведет к тому, что класс не может быть создан. Возможно ли нечто подобное в c ++?

Ответы [ 3 ]

4 голосов
/ 21 ноября 2019

Вам нужно объявить хотя бы один метод чисто виртуальным, например:

class Car {
    int weight;
public:
    Car(int input) {
        weight = input;
    }
    void sayVroem() {
        std::cout << "Vroem...";
    }
    virtual void ImAPureVirtualMethod() = 0;
};

Если у вас нет виртуальных методов

class Car {
    int weight;
    public:
        void sayVroem() {
            std::cout << "Vroem...";
        }
   protected: 
      Car () = default;
};

Или сделать деструктор чисто виртуальным, как

class Car {
    int weight;
    public:
        Car(int input) {
            weight = input;
        }
        void sayVroem() {
            std::cout << "Vroem...";
        }
        virtual ~Car() = 0;
};

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

inline Car::~Car() { }

Есть множество вещей, описывающих это:

https://en.cppreference.com/w/cpp/language/abstract_class

https://www.geeksforgeeks.org/pure-virtual-functions-and-abstract-classes/

2 голосов
/ 21 ноября 2019

Самый простой способ сделать это явно - объявить все конструкторы защищенными => Тогда вы не сможете создать экземпляр класса даже без чистых виртуальных членов.

В вашем случае:

class Car {
    int weight;
protected: // only derived classes can access those functions
    Car(int input) {
        weight = input;
    }
    // if you just have the default c-tor you can move it to protected like this:
    Car() = default;
public:
    void sayVroem() {
        std::cout << "Vroem...";
    }
    // feel free to add virtual methods later on if required
};
0 голосов
/ 21 ноября 2019

Вы пытались искать в Интернете? Я не использую C ++, но исследование кажется довольно простым и с множеством ответов.

IBM Объяснение абстрактных классов C ++

Wikibooks - C ++ Программирование / Классы / Абстрактные классы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...