如何在不重载纯虚函数的情况下将抽象 class 转换为普通 class?

how to convert abstract class to normal class without overload pure virtual function?

看下面的代码:

class A
{
public:
    virtual int getN() = 0;
};

class B : public A
{
private:
    int n = 2;
public:
    int getN() { return n; }
};
class C : public A
{
    // do not contain property n, it nolonger need getN();
};

classA是一个摘要class。现在我有 class C 派生自 A。但它不像 class B 有 属性 n。所以我不能重载getN(),然后class C是一个抽象的class,我不能实例化它。 那么如果我想实例化class C,我该怎么办?

您可以尝试将 A 拆分为单独的接口,这样子 类 可以选择他们希望继承 A 的哪些属性。

以此为例:

class A
{
public:
    virtual int getN() = 0;
};

class A1
{
public:
    virtual int getNum() = 0;
};

class B : public A, public A1
{
private:
    int n = 2;
public:
    int getN() override { return n; }
    int getNum() override { return 42;  }
};
class C : public A1
{
public:
    virtual int getNum() override { return 1; }
};

这里,C不再需要getN(),所以它只继承它需要的接口。这种模式通常称为 interface segregation principle.

继承表示 "kind-of" 关系。

因为 C 没有 getN() 方法,所以它不能是 "kind of" A 因为持有 A 引用的任何人都有期待 getN() 出席的权利。

他们有这个权利,因为你通过将 getN 放在 A 的 public 虚拟接口中声明了它。

故事的寓意 - 尽可能避免继承。更喜欢封装。