C++简单多态问题

Mar*_*rio 0 c++ polymorphism

好吧,我承认,我是一个完全的C++菜鸟.

我正在检查Adam Drozdek在C++中的数据结构和算法,在第1.5节:"多态性"中他提出了下一个例子:

class Class1
{
public:
    virtual void f()
    {
        cout << "Function f() in Class1" << endl;
    }

    void g()
    {
        cout << "Function g() in Class1" << endl;
    }
};

class Class2
{
public:
    virtual void f()
    {
        cout << "Function f() in Class2" << endl;
    }

    void g()
    {
        cout << "Function g() in Class2" << endl;
    }
};

class Class3
{
public:
    virtual void  h()
    {
        cout << "Function h() in Class3" << endl;
    }
};

int main()
{
    Class1 object1, *p;
    Class2 object2;
    Class3 object3;

    p = &object1;

    p->f();
    p->g();

    p = (Class1*)&object2;
    p->f();
    p->g();

    p = (Class1*)&object3;
    p->f();    // Abnormal program termination should occur here since there is 
               // no f() method  in object3, instead object3->h() is called
    p->g();
    //p->h();   h() is not a member of Class1

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我使用Visual Studio 2010编译了这个,发生了两件事:

  1. 首先,该行没有"异常终止" p->f()
  2. h()在应该发生"异常终止"的行中调用object3 的方法.

程序的输出是:

类1中的函数f()类1中的函数g()函数类2中的函数f()函数类1中的g()函数类3中的函数h()函数类1中的g()

我试图理解为什么会这样,但对我来说这似乎太奇怪了.

任何帮助都会很棒.

提前致谢!

Pot*_*ter 12

如果这真的是本书使用的代码,请立即将书籍丢入垃圾箱.多态性在继承上起作用,例如

class Class2 : public Class1
Run Code Online (Sandbox Code Playgroud)

没有它,就没有正确计划的希望.

作者似乎试图通过使用来绕过要求(即,获得不正确的程序编译)

p = (Class1*)&object2;
Run Code Online (Sandbox Code Playgroud)

这是一个C风格的演员表,它被解释为C++

p = reinterpret_cast< Class1 * >( &object2 );
Run Code Online (Sandbox Code Playgroud)

reinterpret_cast是一个危险的运算符,永远不应该在两个多态类型之间使用.这是应该使用的:

// use only if dynamic type of object2 is same as static type:
p = static_cast< Class1 * >( &object2 );
// Will not compile unless you add : public Class1
Run Code Online (Sandbox Code Playgroud)

要么

// returns NULL if object2 dynamic type not derived from Class1
p = dynamic_cast< Class1 * >( &object2 );
Run Code Online (Sandbox Code Playgroud)

至于"异常终止",我认为作者正在描述代码如何在他的机器上崩溃.但是,这并不是因为语言说它应该.他只是写了一个不正确的程序,可能会在某些机器上崩溃而在其他机器上崩溃

  • @Kendrick:我不知道,我从C++那里学到了OO并且没有更糟糕的磨损.同时学习OO和模板是很多东西,但是你永远不会试图让一个看起来像另一个. (2认同)