为什么我要在抽象 class 中实现虚函数而不实现?

Why would I want to implement virtual functions without implementation in an abstract class?

对不起,我不得不问一个愚蠢的问题。 我理解这样实现抽象 class 的好处。如果我有一个带有基本实现的虚函数,在派生的 classes 没有特定实现的情况下总是调用它,那肯定是有好处的,例如 virtual void ImplementedVirtFunc() {//do something basic}

我不太明白的是实现纯虚函数有什么好处,比如 virtual void VirtFunc() = 0;

在这种情况下,如果需要,我派生的 classes 无论如何都需要实现专门化的功能。但是我可以直接在那里实现它并在我的摘要 class.

中省略 virtual void VirtFunc() = 0

那么实施 virtual void VirtFunc() = 0 是否有我没有看到的特定好处?

请原谅我这个愚蠢的问题。我今年一月开始学习 C++,但我还有很长的路要走...

virtual void f();     // virtual member function
virtual void g() = 0; // pure abstract member function

具有至少一个纯虚成员函数的class是一个抽象class,并且不能自己构建,这通常是需要的(只有非抽象的,“具体的”,如果你愿意,派生 classes 应该能够被构建);

struct Abstract {
   virtual void g() = 0;
};

struct NonAbstract {
    virtual void f() {}
};

int main() {
    NonAbstract na{}; // OK
    Abstract a{};     // Error: cannot declare variable 'a' 
                      //        to be of abstract type 'Abstract'
}

抽象 classes 通常以多态方式使用,以允许动态分派派生对象方法:

struct Derived : public Abstract {
    void g() override {}  // #1
}

void h(Abstract const& obj) {
    obj.g();  // dynamic dispatch
}

int main() {
    Derived d{};
    h(d);  // Will result in invoke #1
}

But I could straight forwardly just implement it there and omit the virtual void VirtFunc() = 0 line in my abstract class.

当然可以。但是您将无法从您的基 class 调用该方法,因为您的基 class 根本不知道它的存在。

考虑以下示例。每个 Shape 肯定有一个区域,即使不知道一般形状。 Shape 的每个 subclass 都继承了 Print() 方法。

class Shape {
  // ...
  public:
    virtual int Area() = 0; // there is no formula for the area of a "general" shape, but it definitely has one ...

    virtual void Print() {
      std::cout << "Area: " << Area() << std::endl;
    }
}

class Circle : public Shape {
  // ...
  public:
    virtual int Area() {
      // calculate and return circle area 
    }
}

class Square : public Shape {
  // ...
  public:
    virtual int Area() {
      // calculate and return square area 
    }
}

有两个原因。
一种是 force 派生具体 class 来实现你的虚函数。
二是让你的class成为抽象的class,不能自己实例化