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