指向对象的指针的函数调用问题(含虚函数和纯虚函数知识)

来源:互联网 发布:c语言函数的教学设计 编辑:程序博客网 时间:2024/05/10 07:22

首先是没有涉及虚函数的情况:

对象指针不能指向父类对象

执行同样的函数talk,选择执行指针所指定的talk
例如B *pb,则pb只能指向B或者子类对象,执行相同函数时只执行B的talk

</pre></p><p><pre name="code" class="cpp">#include<iostream>#include<cmath>using namespace std;class A{public:void talk(){cout<<"This is A"<<endl;}};class B:public A{public:void talk(){cout<<"This is B"<<endl;}};class C:public B{public:void talk(){cout<<"This is C"<<endl;}};class D:public C{public:void talk(){cout<<"This is D"<<endl;}};int main(){A a;B b;C c;D d;B *pb;//pb=&a;  (Error!!) //pb->talk();pb=&b;       //执行B的talkpb->talk();pb=&c;       //依旧执行B的talkpb->talk();pb=&d;      //依旧执行B的talkpb->talk();a.talk();  //这里只调用他们自己的b.talk();c.talk();d.talk();   //对象指针不能指向父类对象//执行同样的函数talk,选择执行指针所指定的talk//例如B *pb,则pb只能指向B或者子类对象,执行相同函数时只执行B的talk}




然后是涉及虚函数的情况,如果父类中的那个talk是虚函数,则选择调用当前指向的类对象

#include<iostream>using namespace std;class A{public:void talk(){cout<<"This is A"<<endl;}};class B:public A{public:virtual void talk()   //虚函数talk{cout<<"This is B"<<endl;}};class C:public B   //C继承B{public:    void talk(){cout<<"This is C"<<endl;}};class D:public B   //D继承B{public:void talk(){cout<<"This is D"<<endl;}};class E:public D  //E继承D,相当于继承B{public:void talk(){cout<<"This is E"<<endl;}};int main(){A a;B b;C c;D d;E e;B *pb;//pb=&a;  (Error!!)  //依旧不能指向父类//pb->talk();pb=&b;       //执行B的talkpb->talk();pb=&c;       //执行C的talkpb->talk();pb=&d;      //执行D的talkpb->talk();pb=&e;      //执行D的talkpb->talk();}





纯虚函数:定义的时候,不写纯虚函数的实现,  同时这个类被称作抽象类,不能被实例化

virtual void talk()=0;

继承抽象类的派生类,必须对纯虚函数进行实现,否则会报错(如果没加纯虚,则可以不实现的)

#include<iostream>using namespace std;class A{public:void talk();};class B:public A{public:virtual void talk()=0;  //纯虚函数talk};class C:public B   //C继承B{public:    void talk(){cout<<"This is C"<<endl;}};class D:public B   //D继承B{public:void talk(){cout<<"This is D"<<endl;}};class E:public D  //E继承D,相当于继承B{public:void talk(){cout<<"This is E"<<endl;}};int main(){A a;//B b;  (Error!)抽象类不可实例化,指针也不行C c;D d;E e;c.talk();d.talk();e.talk();}


0 0