派生类对象与基类类型兼容时,使用派生类构造

时间:2011-01-07 08:43:09

标签: c++ inheritance constructor

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时应该进行构造。无论如何它的用途是什么?只是好奇地知道它为什么这么设计:)

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

derivedClass成员初始化原因的理由是,如果derivedClass有任何虚函数覆盖baseClass中声明的那些虚拟函数,并且这些成员引用derivedClass的数据成员,必须进行初始化,或者在调用这些函数时,结果将是未定义的。

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