从类模板实例化的每个模板类有自己的类模板数据成员,该模板类的所有对象共享一个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的话,可以正确指向哪个类对象的函数。