浅谈浅谈C++中中virtual的三种用法的三种用法
virtual用法一用法一
#include
using namespace std;
class A{
public:
virtual void display(){ cout<<"A"<<ENDL; }
};
class B : public A{
public:
void display(){ cout<<"B"<<ENDL; }
};
void doDisplay(A *p)
{
p->display();
delete p;
}
int main(int argc,char* argv[])
{
doDisplay(new B());
return 0;
}
这段代码打印出的结果为B,但是当把A类中的virtual去掉之后打印出的就为A。当基类中没有virtual的时候,编译器在编译的
时候把p看做A类的对象,调用的自然就是A类的方法。但是加上virtual之后,将dispaly方法变成了虚方法,这样调用的时候编
译器会看调用的究竟是谁的实例化对象,这样就实现了多态的效果。也就是说,当基类的派生类中有重写过基类的虚方法的时
候,使用基类的指针指向派生类的对象,调用这个方法实际上调用的会是派生类最后实现的方法
virtual用法二用法二
#include
using namespace std;
class Person{
public: Person(){ cout<<"Person构造"<<ENDL; }
~Person(){ cout<<"Person析构"<<ENDL; }
};
class Teacher : virtual public Person{
public: Teacher(){ cout<<"Teacher构造"<<ENDL; }
~Teacher(){ out<<"Teacher析构"<<ENDL; }
};
class Student : virtual public Person{
public: Student(){ cout<<"Student构造"<<ENDL; }
~Student(){ cout<<"Student析构"<<ENDL; }
};
class TS : public Teacher, public Student{
public: TS(){ cout<<"TS构造"<<ENDL; }
~TS(){ cout<<"TS析构"<<ENDL; }
};
int main(int argc,char* argv[])
{
TS ts;
return 0;
}
这段代码的终端输出结果为:
Person构造
Teacher构造
Student构造
TS构造
TS析构
Student析构
Teacher析构
Person析构
当Teacher类和Student类没有虚继承Person类的时候,也就是把virtual去掉时候终端输出的结果为:
Person构造
Teacher构造
Person构造
Student构造
TS构造