如何在C ++中声明抽象类

时间:2019-11-21 07:33:16

标签: c++ oop

在学习Java之后,我对用C ++实现对象定向感到困惑。

上了课:

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

在Java中,我可以通过将其声明为public abstract class Car来声明一个抽象类。这将导致无法实例化该类。在c ++中可能有类似的东西吗?

3 个答案:

答案 0 :(得分:4)

您需要至少声明一种纯虚拟的方法,例如:

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/

答案 1 :(得分:2)

显式执行此操作的最简单方法是将所有构造函数声明为protected =>这样,即使没有纯虚拟成员,也无法实例化该类。

在您的情况下:

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

答案 2 :(得分:0)

您是否尝试过在线搜索? 我没有使用C ++,但是研究似乎很容易,并且有很多答案。

https://www.npmjs.com/package/module-alias

IBM Explanation of C++ abstract classes