2011-01-07 99 views
0
class baseClass{}; 
class derivedClass : public baseClass{}; 
baseClass *obj = new derivedClass ;  // For simplicity, I amn't providing any- 
             // class members. 

虽然,baseClassderivedClass施工发生,derivedClass成员是不透明的obj。那么,什么是derivedClass构造的用法。顺便说一句,我明白derivedClass构造函数调用baseClass构造函数,并在返回derivedClass构造应该发生。无论如何,它有什么用处?只是好奇,想知道为什么是这样设计的:)使用派生类对象时,派生类结构的与基类类型兼容

回答

1

总之,多态。换句话说,在一个从一个公共基类派生出多个类的系统中,它能够以相同的方式处理不同派生类的对象,而不用担心它们的实际类型。

考虑管理各种形状的绘图包。您可以选择使用称为Shape的抽象基类来实现像Draw()这样的常用方法,并且可能具有一些公共数据成员,如x-pos和y-pos等所有形状。然后,您可以创建一些派生的具体类,如Ellipse和Square,它们将采用它们自己的形状特定的构造函数参数,并从抽象类中重写Draw()方法。例如,Circle构造函数可能需要x-pos,y-pos和radius;它将使用radius参数本身,但将x-pos和y-pos参数传递给继承的构造函数。

然后,您可以实现一个Drawing()类,该类充当各种Shapes的容器,并遍历该容器来绘制绘图,而不必担心要绘制的特定形状的实际类型。

+0

+1这正是我想说的,除了无限更清晰。 – templatetypedef 2011-01-07 09:16:14

0

背后为什么derivedClass成员都得到初始化的理由是因为如果derivedClass有覆盖baseClass的声明,这些成员参考derivedClass数据成员的任何虚函数,必须进行初始化或者,当这些函数被调用时,结果将是不确定的。

一般来说,除非您尝试使用多态类,否则不会使用继承。如果派生类不能拥有自己的状态,那么基类将不得不猜测派生类中所需的所有可能的数据,这将是脆弱的,脆弱的设计方法。