好吧,我承认,我是一个完全的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编译了这个,发生了两件事:
p->f()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)
至于"异常终止",我认为作者正在描述代码如何在他的机器上崩溃.但是,这并不是因为语言说它应该.他只是写了一个不正确的程序,可能会在某些机器上崩溃而在其他机器上崩溃