virtual :: 方法和属性如果作为虚拟成员,虚拟成员的实现可由派生类中的重写成员更改。默认情况下方法是非虚拟的,不能重写非虚函数。不能将virtual 修饰符和一下修饰符一起使用:static abstract override 如果认为某个方法通用性比较弱,就用virtual 声明该方法,然后用户可以根据不同的情况继承并进行重载。abstract :: 声明为 abstract 成员可以不包括实现代码,但只要类中还有未实现的抽象成员(抽象方法),那么这个类就是一个抽象类,抽象类的对象就不能被实例化,通常用于强制继承类必须实现某一成员.抽象类是必须要派生子类的。并且,如果子类没有实现抽象基类的所有方法,则子类也成为一个抽象类。
static :: 对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷 贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共 用。 所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。 在Example 5中,语句int Myclass::Sum=0;是定义静态数据成员;因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类 对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它
静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:
<;数据类型><;类名>::<;静态数据成员名>=<;值>
#include<iostream.h>
class Myclass
{
public:
Myclass(int a,int b,int c);
void GetSum();
private:
int a,b,c;
static int Sum;//声明静态数据成员
};
int Myclass::Sum=0;//定义并初始化静态数据成员
Myclass::Myclass(int a,int b,int c)
{
this->a=a;
this->b=b;
this->c=c;
Sum+=a+b+c;
}
void Myclass::GetSum()
{
cout<<"Sum="<<Sum<<endl;
}
void main()
{
Myclass M(1,2,3);
M.GetSum();
Myclass N(4,5,6);
N.GetSum();
M.GetSum();
}
override :: 当子类声明了与基类相同名字的方法,而且使用了相同的签名时,就称派生类的成员覆盖(hide)了基类的成员