多态,从希腊语言的理念而来, c++支持单继承的同时同样支持多继承。而Java仅保留了单继承,多继承由接口实现。 virtual这一关键字,体现一种公享,避免了信息的冗余。而且,体现一种c++面向对象的一种机制。 从理论到底层实现,虽然有不安全的体现。 #include"sts.h" #if(0) #endif #if(0) class B { virtual void vfun(int i = 10); }; class D : public B { virtual void vfun(int i = 20); }; int main() { // D* pD = new D(); // B* pB = pD; // pD->vfun(); // pB->vfun(); return 0; } #endif #if(0) class B { public: void DoSomething(); virtual void vfun(); }; class C : public B { public: void DoSomething();//首先说明一下,这个子类重新定义了父类的no-virtual函数,这是一个不好的设计,会导致名称遮掩;这里只是为了说明动态绑定和静态绑定才这样使用。 virtual void vfun(); }; class D : public B { public: void DoSomething(); virtual void vfun(); }; int main() { //D* pD = new D(); //B* pB = pD; return 0; } #endif #if(0) class B { public:void show(){cout<<"B"<<endl;} }; class C : public B { public:void show(){cout<<"C"<<endl;} }; class D : public B { public:void show(){cout<<"D"<<endl;} }; int main() { D* pD = new D();//pD的静态类型是它声明的类型D*,动态类型也是D* B* pB = pD;//pB的静态类型是它声明的类型B*,动态类型是pB所指向的对象pD的类型D* C* pC = new C(); pB = pC;//pB的动态类型是可以更改的,现在它的动态类型是C* pB->show(); pC->show(); pD->show(); return 0; } #endif #if(1) #include<stdio.h> #include<iostream> #include<queue> using namespace std; class A { public: A(){printf(" create A.\n");} int a; virtual void fun1(){} }; class B:virtual public A{ public: B(){printf(" create B.\n");} int b; virtual void fun2(){} }; class C:virtual public A { public : int c; C(){printf("create C .\n");} virtual void fun3(){printf("fun3 .\n");} }; class D:public C,public B { public: int d; D(){printf("create D .\n");} virtual void fun3(){printf("fun4 .\n");} }; //二义性问题的开销 int main() { D *pd=new D; pd->B::a=1; pd->C::a=2; printf("%d\n",pd->B::a); printf("%d\n",pd->C::a); printf("%d\n",sizeof(D)); //getchar(); } #endif #if(0) #include<stdio.h> #include<iostream> #include<queue> using namespace std; class A { public: A(){printf("A create.\n");} int a; virtual void fun(){} }; class B: public A{ public: B(){printf("B create.\n");} int b; virtual void fun1(){} }; class C: public A { public : int c; C(){printf("C create.\n");} virtual void fun3(){printf("fun3 .\n");} }; class D:public C,public B{ public: int d; D(){printf("D create.\n");} virtual void fun3(){printf("fun4 .\n");} }; //二义性问题的开销 int main() { D *pd=new D; printf("%d\n",sizeof(D)); //getchar(); } #endif
一点整理
原创
©著作权归作者所有:来自51CTO博客作者文洲的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:C++ 写类中的一个bug修复
下一篇:链表
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
[嵌入式软件设计师】知识点整理(1)
嵌入式软件设计师备考知识点总结
地址总线 嵌入式软件备考 -
关于MyBatis sqlSession的一点整理
原文地址:关于MyBatis sqlSessio 首先, 通过翻阅源码,我们来整理一下mybatis进行持久化操作时
sql spring hibernate -
Linux 下安装MySql的一点整理
linux平台下的mysql安装与配置
安装 配置 mysql -
大数据方向问题的一点整理
最近的一些内容整理
数据 数据产品 大数据 -
一点一点地进步
一点一点地进步,我相信踏踏实实终有所报~坚持每次存盘计划
职场 休闲 计划 进步 -
一些知识点整理
杂七杂八
java jvm redis Java 缓存