virtual
(1)虚函数是为了解决继承中多态的问题,比如基类动物,方法行动,派生类老虎,蛇,鸟都能继承基类的行动方法,但是有跑有爬有飞各有不同,这些应该是在运行的时候根据对象选择的方法, 而不是在编译的时候就确定选择。函数的重载是根据返回值,参数的不同做区别,函数的重写是根据对象的不同做区别,其中多态的实现是派生类向上转型成基类。
(2)将析构函数设为虚函数,因为析构的属性是派生类-基类,如果有基类指向派生类的情况(向上转型),如果先析构了派生类,那么基类指针可能就悬空了,其实跟归结到还是析构在多态上的解决
class MyClass
{
public:
virtual int * set(int *x)
{
cout << "是我" << endl;
return x;
};
};
class youclass :public MyClass
{
public:
virtual int* set(int *x)
{
cout << "是你" << endl;
return x;
}
};
class sheclass :public MyClass
{
public:
virtual int* set(int *x)
{
cout << "是她" << endl;
return x;
}
};
int main()
{
int *x=new int ;
*x = 1;
MyClass *m;
MyClass *c = new MyClass;
m = c;
m->set(x);
sheclass *a = new sheclass;
m = a;
m->set(x);
youclass *b = new youclass;
m = b;
m->set(x);
sheclass *d = new sheclass;
m = d;
m->set(x);
}
向下转型是强制把派生的属性赋予父类
sheclass *a = new sheclass;
(MyClass*)a;
a->set(x);
youclass *b = new youclass;
(MyClass*)b;
b->set(x);
sheclass *d = new sheclass;
(MyClass*)d;
d->set(x);
virtual()=0
纯虚函数的作用是基类把方法声明出来自己却不能实现,让派生类实现。所以叫抽象类(接口)
重定义
就是不加虚函数的重写,不发生多态,除非在调用的时候向上转型,否则派生类会覆盖基类方法
template
其实就是泛型,在运行的时候确定参数类型
inline
内联,相当于静态编译的函数
operator
注意参数的问题,其实隐含了this作为参数,所以不能超过1
namespace
为了防止不同库中函数,变量,类同名的问题