C++虚函数的用法

从类模板实例化的每个模板类有自己的类模板数据成员,该模板类的所有对象共享一个static数据成员

和非模板类的static数据成员一样,模板类的static数据成员也应该在文件范围定义和初始化

每个模板类有自己的类模板的static数据成员副本

class A
 { public:
       virtual ~A(){ cout << "A::~A() is called.\n" ; }
 } ;
class B : public A
 { public:
        ~B(){ cout << "B::~B() is called.\n" ; }
} ;
void main()
 { 
  A *Ap = new B ;	
    B *Bp2 = new B ;
    cout << "delete first object:\n" ;
    delete Ap;
    cout << "delete second object:\n" ;
    delete Bp2 ;
}

不用virtual修饰的话,基类指针new B对象时,释放动态声明的内存只能释放派生类中基类析构函数。

在基类中使用virtual的话,可以正确指向释放释放的哪个类的内存。

template<typename T>

class A

{  

public:

    

     A() {};

     A(int a)

     {

              num = a;

     }

     virtual void shownum()

     {

              cout << num << "\t";

     }

protected:

     static int num;

};

int A<int>::num = 0;//只有静态成员才能在其类外定义

class B : public A<int> //派生一般类

{

public:

     B() {};

     B(int a, double x) :A(a) ,y(1)

     {

              y = x;

     }

     void shownum() {

              cout << y <<"afaf"<< endl; }

protected:

     double y;

};

Void main()

{

     A<int> c(1);

     c.shownum();

     A<int>* a,*d;

     B b(12,2);

     a = &b;

     a->shownum();

     d = new A<int>;

     d->shownum();

}

虚析构函数:可以在子类中正确释放内存。

被关键字 virtual 修饰的成员函数称为虚函数

实现运行时多态的关键首先是要说明虚函数,另外,必须用

基类指针调用派生类的不同实现版本

 

输出窗口:

 

 

 

被virtual修饰的函数只能在派生类中重写这个方法实现多个版本,

在基类中使用virtual的话,可以正确指向哪个类对象的函数。

猜你喜欢

转载自blog.csdn.net/qq_41979469/article/details/90545114