在这种派生类的情况下,我想问一个关于编程风格的问题:
class A
{
public:
virtual foo1()=0;
}
class B: public A
{
public:
virtual foo1();
virtual foo2();
}
class C: public A
{
public:
virtual foo1();
}
int main() {
B mB();
C mC();
mB.foo2() //OK!
mC.foo2() // obviously, it is not correct
return 0;}
因此,派生类是否应该具有比抽象基类更少或相等的公共方法?
如果派生类需要更多方法,那么它们应该是私有的吗?
4 回答
这个类结构没有错 . 派生类有比父类更多的方法没有任何问题 - 它是相当普遍的 .
mC.foo2();
行是错的,这不是类的错 .派生类几乎总是具有比基类更多的公共函数 . 这是继承点:您可以定义一个仅概述变量基本行为的抽象基类,然后派生类可以针对特定情况扩展此基本行为 .
继承的类始终是基类的特化 . 它实现了更具体的功能(通常还有更多的功能) . 在你're example, you'期望两个不同的特化在表示基类定义的行为之外的相同方式 . (
foo2
未在A
中定义) . 这就是问题所在 . 如果需要在A
之外定义公共行为,解决方案是创建一个中间类 .现在任何可以实现
foo2
的类都应该扩展Intermediate
,任何需要功能foo2
的函数都应该要求一个至少类型为Intermediate
的变量 .派生类必须至少从基类实现 ALL 抽象方法 . 这是最低限度 . 如果您确实添加了其他方法,成员或其他任何由您决定的 .
但是从类中派生并且不添加任何东西并不是很聪明,因为这不是继承的目的(至少
IS-A
-relationships) . 如果你去private inheritance
,它可能会有所不同 .在我所参与的几乎所有项目中,我们的基类具有比派生类更少的功能 - 在极端情况下,基类甚至可能几乎没有功能,但派生类有几十个函数和六个成员变量 .
这正是派生类的意图 .
显然,您需要知道您拥有什么类型的派生类,并且只有在可用时才使用派生类“额外”函数 .