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

◇◆丶佛笑我妖孽 提交于 2019-12-25 12:42:09

问题


look at following code:

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

class A is a abstract class. Now I have class C derived from A. But it dose not like class B has a property n. So I can't overload getN(), and then class C is a abstract class, which I cannot instantiate it. So if I want instantiate class C, what should I do?


回答1:


Inheritance represents a "kind-of" relationship.

Since C does not have a getN() method, it cannot be a "kind of" A since anyone holding a reference to an A has the right to expect getN() to be present.

They have this right because you asserted it by putting getN in the public virtual interface of A.

Moral of the story - avoid inheritance if you can. Prefer encapsulation.




回答2:


You can try to split A into separate interfaces, which allows sub classes to pick and choose which properties of A they wish to inherit.

Take this, for example:

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

Here, C no longer needs getN() so it inherits only from the interfaces that it needs. This pattern is commonly referred to as the interface segregation principle.



来源:https://stackoverflow.com/questions/33847779/how-to-convert-abstract-class-to-normal-class-without-overload-pure-virtual-func

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!