C中3个类的多态性
以下代码打印1 2,但我希望它打印1 1.
#include <iostream> using namespace std; class A { public: virtual void f() { cout << "0" << endl; } }; class B : public A{ public: void f() { cout << "1" << endl; } }; class C : public B{ public: void f() { cout << "2" << endl; } }; int main() { A *pa = new B(); B *pb = new C(); pa->f(); pb->f(); } 根据我的理解,pa-> f()执行B的f()函数,因为A是虚拟的,但是当B的f()不是虚拟时,为什么pb-> f()执行C的f()函数. 另外,如果我从A类中删除’virtual’,它会打印0 1,这是有道理的,因为A和B执行它们自己的f()函数,因为它们不是虚拟的.如果它没有受到影响,pb-> f()会如何变化,因为只有A会发生变化? 解决方法
因为pb的动态类型是C而C :: f确实是虚拟的.当你申报时 virtual void f(); 在基类中,层次结构中派生类的每个其他void f()也是虚拟的,如§10.3/ 2所示:
(强调我的) 事实上: class A { public: virtual void f() { cout << "0" << endl; } }; class B : public A{ public: virtual void f() { cout << "1" << endl; } }; class C : public B{ public: virtual void f() { cout << "2" << endl; } }; 相当于你的代码.恰好C标准允许在这些情况下省略虚拟. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |