本篇将对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函数,则只影响它的子类,并不对父类造成任何影响。