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

时间:2015-11-21 19:41:15

标签: c++ virtual

查看以下代码:

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

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

2 个答案:

答案 0 :(得分:2)

继承代表了一种"种类的"关系。

由于C没有getN()方法,因此它不能是"类型的" A,因为任何持有A引用的人都有权期待getN()出席。

他们有这个权利,因为您通过将getN放在A的公共虚拟界面中来声明它。

故事的道德 - 如果可以的话,避免继承。更喜欢封装。

答案 1 :(得分:0)

您可以尝试将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