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