C++ virtual的讲解
来源:互联网 发布:数据跟踪 编辑:程序博客网 时间:2024/06/17 12:19
本篇将对vitual的使用做一些说明。
1、vitual函数在被类对象操作的时候跟普通函数差不多
class A{public:void print(){cout << "A()" << endl;}};class B : public A{public:void print(){cout << "B()" << endl;}};int _tmain(int argc, _TCHAR* argv[]){A a;a.print();B b;b.print();return 0;}
结果:
A()
B()
2、virtual函数在被指针调用的时候显示出了普通函数不具有的动态性。
(1)普通的函数
class A{public:void print(){cout << "A()" << endl;}};class B : public A{public:void print(){cout << "B()" << endl;}};int _tmain(int argc, _TCHAR* argv[]){A* a;B b;a = &b;a->print();return 0;}
输出结果:
A()
(2)virtual虚函数
class A{public:virtual void print(){cout << "A()" << endl;}};class B : public A{public:virtual void print(){cout << "B()" << endl;}};int _tmain(int argc, _TCHAR* argv[]){A* a;B b;a = &b;a->print();return 0;}
输出结果:
B()
(3)用不同的子类对象赋予父类指针
class A{public:virtual void print(){cout << "A()" << endl;}};class B : public A{public:virtual void print(){cout << "B()" << endl;}};class C : public B{public:virtual void print(){cout << "C()" << endl;}};int _tmain(int argc, _TCHAR* argv[]){A* a;B b;a = &b;a->print();C c;a = &c;a->print();return 0;}
输出结果:
B()
C()
分析:从上述结果可以看出父类的指针可以调用子类的virtual函数,而且是调用原本子类所提供的那个virtual函数,从而实现动态绑定。
3、在哪个类A中定义virtual,继承于它的类才拥有virtual属性,而类A所继承的之前的类并不具备vitual属性。
(1)
class A{public:virtual void print(){cout << "A()" << endl;}};class B : public A{public:void print(){cout << "B()" << endl;}};class C : public B{public:void print(){cout << "C()" << endl;}};int _tmain(int argc, _TCHAR* argv[]){A* a;B b;a = &b;a->print();C c;a = &c;a->print();return 0;}
输出结果:
B()
C()
(2)
class A{public:void print(){cout << "A()" << endl;}};class B : public A{public:virtual void print(){cout << "B()" << endl;}};class C : public B{public:virtual void print(){cout << "C()" << endl;}};int _tmain(int argc, _TCHAR* argv[]){A* a;B b;a = &b;a->print();C c;a = &c;a->print();return 0;}
输出结果:
A()
A()
(3)
class A{public:void print(){cout << "A()" << endl;}};class B : public A{public:virtual void print(){cout << "B()" << endl;}};class C : public B{public:virtual void print(){cout << "C()" << endl;}};int _tmain(int argc, _TCHAR* argv[]){A* ap;B* bp;B b;C c;ap = &b;ap->print();ap = &c;ap->print();bp = &c;bp->print();return 0;}
输出结果:
A()
A()
C()
分析:从(1)中可以看出当一个类中的函数有virtual前缀时,不管子类是否加上virtual,都会被认为是虚函数。
从(2)(3)中可以看出,在整个继承关系中,如果一个函数被定为virtual函数,则只影响它的子类,并不对父类造成任何影响。
0 0
- C++ virtual的讲解
- C++virtual的例子(2)
- C++ Virtual基础知识讲解
- C++ Virtual基础知识讲解
- Abstract和Virtual以及Interface的使用讲解
- 对private内存、virtual内存的一些讲解
- C#virtual详解,virtual和构造函数的问题
- c++virtual
- C#: Interface, Abstract and Virtual 的区别
- C#virtual,override,new的使用
- virtual和abstract的区别(C#)
- c++virtual的动态调用验证
- 关于C#:abstract,virtual
- C++Virtual详解
- Virtual & Abstract (C++)
- C#virtual override new
- C++ virtual 继承
- C# 关键字--virtual
- JAVASE窗体应用程序开发技术(一)
- 用QTextSream往txt/js文件写数据时出现“黑色小方框”
- 简单工厂模式
- 移动App的REST API设计实践
- MFC 点击按钮,弹出另一个对话框
- C++ virtual的讲解
- oracle安装完没/etc/oratab
- NGUI 比较常用的几个方法
- Java反射机制(一):认识Class类
- VC++动态链接库(DLL)编程深入浅出
- Android之NDK开发
- 在主成分分析中的协方差矩阵与自相关矩阵的差别
- C++ 中的const关键字
- stm32 ucgui无触屏移植