C++ 虚函数 派生类的调用

来源:互联网 发布:淘宝众筹logo 编辑:程序博客网 时间:2024/05/29 18:03
#include <iostream>using namespace std;class A{public:virtual void print(){cout<<"a"<<endl;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////virtual void print(int){//当没有这一部分时,下面调用类B的带参成员函数时就会报错,为什么?cout<<"这是类A自己定义的一个函数!"<<endl;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////};class B:public A{//自己定义一个函数,并输出结果???public:void print(int){cout<<"这是类B自己定义的一个函数!"<<endl;}};class C:public A{public:void print(){cout<<"c"<<endl;}};class D:public A{public:void print(){cout<<"d"<<endl;}};int main(){A a;B b;C c;D d;A *p=&a;A *p1=&b;A *p2=&c;A *p3=&d;p->print();//p1->print();p1->print(1);//'print' : function does not take 1 parameters?p2->print();p3->print();return 0;}
程序运行出现错误:(代码p1->print(1)所在行)
'print' : function does not take 1 parameters?
原因在于此带有参数的函数没有在类A中出现,是类B所定义的一个函数。当函数运行下列语句:
p->print();p2->print();p3->print();

时,发生了动态绑定,非别调用类A、B、C的成员函数print(),而他们都存放在一个虚函数列表中(此处注意:基类A中print()为虚函数,则派生类中的print()函数默认为虚函数!!!),可以被类A定义的指针访问,而类B中print(int)成员函数不是继承类A而来,不问虚函数,因此不会出现在虚函数列表中,也就无法被类A所定义的指针在程序运行时动态绑定,无法访问,因此,出现运行错误。

修改方法:可以将

A *p1=&b;
改为:
B *p1=&b;即可。
或者:如源代码中,加入两行///线中函数print(int)的定义,但这时,通过指针调用类B中print(int)就跟调用print()函数的道理相同了。