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