虚函数和普通函数的区别(c++)

虚函数和普通函数的区别(c++)给几段代码 include iostream using namespace std class A public virtual void show cout lt lt showA lt

大家好,我是讯享网,很高兴认识大家。

给几段代码:

#include"iostream" using namespace std; class A{ public: virtual void show(){cout<<"showA"<<endl;} void printA(){cout<<"printA"<<endl;} }; class B:public A{ public: void show(){cout<<"showB"<<endl;} void printB(){cout<<"printB"<<endl;} }; void fun(A *p){p->printA(),p->show();} int main() { A a; B b; fun(&a); fun(&b); return 0; }

讯享网


讯享网

讯享网#include"iostream" using namespace std; class A{ public: void show(){cout<<"showA"<<endl;} void printA(){cout<<"printA"<<endl;} }; class B:public A{ public: void show(){cout<<"showB"<<endl;} void printB(){cout<<"printB"<<endl;} }; void fun(A *p){p->printA(),p->show();} int main() { A a; B b; fun(&a); fun(&b); return 0; }

我再给出一两段不同的代码:(错误代码)

#include <iostream> using namespace std; class A {public: void show(){cout<<"showA"<<endl; } void printA(){cout<<"printA"<<endl; } } ; class B:public A {public: void show(){cout<<"showB"<<endl; } void printB(){cout<<"printB"<<endl; } } ; void f(A *p){p->show();p->printA(); //p->printB(); } int main() { A a; B b; f(&a);f(&b); //都是A类 return 0; }
讯享网#include <iostream> using namespace std; class A {public: virtual void show(){cout<<"showA"<<endl; } void printA(){cout<<"printA"<<endl; } } ; class B:public A {public: void show(){cout<<"showB"<<endl; } void printB(){cout<<"printB"<<endl; } } ; void f(A *p){p->show();p->printA(); p->printB(); } int main() { A a; B b; f(&a); f(&b); return 0; } 

报错13    41    F:\未命名1.cpp    [Error] 'class A' has no member named 'printB'

意思就是A里没有 printB这个函数;

注释掉:

#include <iostream> using namespace std; class A {public: virtual void show(){cout<<"showA"<<endl; } void printA(){cout<<"printA"<<endl; } } ; class B:public A {public: void show(){cout<<"showB"<<endl; } void printB(){cout<<"printB"<<endl; } } ; void f(A *p){p->show();p->printA(); //p->printB(); } int main() { A a; B b; f(&a); f(&b); return 0; } 

 多态,基类指针的眼睛就只能看那么大的地方
  三种:基类指针,虚函数,子类重写父类的虚函数
  注意:(1)如果没有指针,父类对象调用就是父类中的成员函数,子类对象调用的就是子类中的成员函数,这个不能多态
    (2)基类指针就算得到了子类对象的地址,那么,基类指针除了可以调用继承过来的公共成员函数及被子类重写的虚函数外,子类中的其他成员函数基类指针不能调用。

例如:

讯享网 #include <iostream> using namespace std; class A {public: virtual void show(){cout<<"showA"<<endl; } void printA(){cout<<"printA"<<endl; } } ; class B:public A {public: void show(){cout<<"showB"<<endl; } void printB(){cout<<"printB"<<endl; } } ; void f(A *p){p->show();p->printA(); // p->printB(); } int main() { A a; B b; a.show();a.printA(); //a.printB(); b.show();b.printA(); b.printB(); return 0; } 

#include <iostream> using namespace std; class A {public: virtual void show(){cout<<"showA"<<endl; } void printA(){cout<<"printA"<<endl; } } ; class B:public A {public: void show(){cout<<"showB"<<endl; } void printB(){cout<<"printB"<<endl; } } ; void f(A *p){p->show();p->printA(); // p->printB(); } int main() { A *p,a; B b; p=&a; p->show();p->printA(); //a.printB(); p=&b; p->show();p->printA(); //p->printB(); return 0; }

讯享网#include <iostream> using namespace std; class A {public: virtual void show(){cout<<"showA"<<endl; } void printA(){cout<<"printA"<<endl; } } ; class B:public A {public: void show(){cout<<"showB"<<endl; } void printB(){cout<<"printB"<<endl; } } ; void f(A *p){p->show();p->printA(); // p->printB(); } int main() { A a,&p=a; B b; p=a; p.show();p.printA(); //a.printB(); p=b; //赋值 p.show();p.printA(); //p->printB(); return 0; } 

#include <iostream> using namespace std; class A {public: virtual void show(){cout<<"showA"<<endl; } void printA(){cout<<"printA"<<endl; } } ; class B:public A {public: void show(){cout<<"showB"<<endl; } void printB(){cout<<"printB"<<endl; } } ; void f(A *p){p->show();p->printA(); // p->printB(); } int main() { B b; A &p=b; //初始化 p.show();p.printA(); //p->printB(); return 0; } 

 

 

小讯
上一篇 2025-02-17 14:59
下一篇 2025-01-26 22:59

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/36111.html