查看以下代码:
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类,我该怎么办?
答案 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。