多态性:实例类?

时间:2013-05-13 22:23:58

标签: c++ polymorphism

是否有必要为该类实例派生另一个类?
如果我不这样做,我仍然可以访问它的方法,就像在这个例子中一样:

#include <iostream>
struct Class1 {
public:
    void func();
};

struct Class2 : public Class1 {
    // Class1 c1; <-- is this necessary?
};

void Class1::func(){
    std::cout << "function called" << std::endl;
}
int main() {
    Class2 c2;
    c2.func();
}

我得到了预期的function called 但在某些示例中,我看到基类正在派生类中实例化:Class1 c1;。它的用途是什么?

4 个答案:

答案 0 :(得分:2)

  

是否有必要在类中实例派生另一个类?

不,绝对没有必要。

  

但在某些示例中,我看到基类正在派生类中实例化:Class1 c1;。它的用途是什么?

在不知道这些例子具体处理的内容 - 即那些类的语义是什么 - 以有意义的方式解释它们并不容易。但是,当您创建某种类型的数据成员时,您的对象具有该类型的子对象。所以当你这样做时:

struct Y { };

struct X
{
    int a;
    std::string b;
    Y c;
};

X类型的每个对象都有一个类型为a的子对象int,一个类型为b的子对象b和一个子对象{{1}类型为c的}。您将使用点表示法访问它,如下所示:

Y

类似地,当类Y foo(); X x; std::cout << x.a; x.b = "Hello, World!"; X.c = foo(); 派生自基类D时,它包含类型为B的子对象,并隐式继承B的所有数据成员}:

B

现在,在您的情况下,除了struct B { int a; std::string b; }; struct D : B { bool c; }; // ... D d; d.c = true; d.b = "Hello, Base Class!"; d.a = 42; 派生之外,类Class2还具有Class1类型的数据成员。请注意,此数据成员Class1的基础子对象,而是其他成员子对象。那是什么意思呢?

以一粒盐为例,但为了发展直觉,您可以认为继承模拟了“IS-A”关系,而数据成员关系模拟了“HAS-A”关系。

因此Class2Class2公开派生的事实表明“所有Class1个对象都是Class2个对象”,因此继承Class1数据成员。这解释了为什么Class1类型的对象具有Class2类型的基础子对象。

另一方面,Class1具有类型Class2的数据成员的事实模拟了“所有Class1个对象包含/嵌入/拥有类型{{{ 1}}”。这解释了为什么类型为Class2的对象具有Class1类型的成员子对象。

现在在示例的特定情况下,您提到上述两种语义都是同时建模的 - 即Class2 IS-A和HAS-A Class1 - 但是没有必要。不是每个Class2 IS-A Class1也是HAS-A thingy

我希望以抽象的方式对你有意义。设计是否正确主要取决于widgetwidget对象的语义,以及它们的模型,但消息是:

  

如果Class1来自Class2,则没有任何内容可以强制您将Class2数据成员添加到Class1

答案 1 :(得分:0)

在这种情况下,派生类中不需要有基类成员变量。此外,多态性仅适用于指针和引用类型。

答案 2 :(得分:0)

不,没有必要。

class Base {

}

class Derived : public Base {

}

Derived类将继承Base类的成员。

答案 3 :(得分:0)

绝对没有必要。如果没有看到您所指的示例,则很难说出作者为何会创建该实例。最有可能的是显示当Class2 :: func()调用c1.func()时会发生什么。