首页 > 代码库 > C++学习总结3
C++学习总结3
链接上一篇日志,C++学习总结2,下面介绍下C++里面的其他内容
虚函数:一个接口,多种方法。
多态:编译时的多态与运行时的多态。
编译时的多态表现为运算符的重载与函数的重载。
运行时的多态表现为使用派生类与虚函数。
虚函数需要使用关键字virtual。 指向派生类型的指针。
基类型指针与派生类指针 .基类指针可以指向任何派生类的对象。
a_class *p;
a_class a_obj;
b_class b_obj;
p = &a_obj;
p = &b_ obj; //这个是引用
注:它可以指向派生类型的对象,但不能够访问派生类对象中定义的成员。
#include<iostream>
using namespace std;
class a_class
{
public:
virtual void vf()
{
cout << "这是一个基类型的函数" <<endl;
}
};
class b_class:public a_class
{
public:
void vf()
{
cout << "这是第一个派生类的函数"<<endl;
}
};
class c_class : public a_class
{
public:
void vf()
{
cout << "这是第二个派生类的函数"<<endl;
}
};
int main()
{
a_class *p;
a_class a_obj;
b_class b_obj;
c_class c_obj;
p = &a_obj;
p->vf(); //没有p.vf()之说,*p.vf/()也不对,返回的是vf是一个指针量。
p = &b_obj;
(*p).vf();
p = &c_obj;
(*p).vf();
return 0;
}
当然我们也可以用引用来调用虚函数。上面是通过基类指针来调用虚函数。
有啥意义??一个现在的函数先定义好,在未来我们可以指向一个未知的函数。 这就是牛X的地方。你用一个现在的东西调用过去的东西很容易,但用现在的东西调用未来的东西就很神奇了吧!!!
#include<iostream>
using namespace std;
class a_class
{
public:
virtual void vf()
{
cout << "这是一个基类型的函数" <<endl;
}
};
class b_class:public a_class
{
public:
void vf()
{
cout << "这是第一个派生类的函数"<<endl;
}
};
class c_class : public a_class
{
public:
void vf()
{
cout << "这是第二个派生类的函数"<<endl;
}
};
void func(a_class &m) //)&在此不是求地址运算,而是起标识作用,这里没有&意义一样,不影响。
{
m.vf(); //直接以变量作为实参进行调用即可,而不需要实参变量有任何的特殊要求。
}
int main()
{
a_class a_obj;
b_class b_obj;
c_class c_obj;
func(a_obj);
func(b_obj);
func(c_obj);
return 0;
}
使用了基类引用调用了虚函数。
虚属性继承:
当一个继承了虚函数的派生类被另一个类派生类时,这个虚函数仍然可以被覆盖,但无论虚函数继承了多少次,他的本质仍然是虚函数。
//定义一个基类
class base
{
public:
virtual void v_func()
{}
};
//定义一个基类的派生类
class der1:public base
{
public:
void v_func()
{}
} ;
// 派生类的派生类
class der2:public der1
{
public:
void v_func()
{}
};
当一个函数被基类声明为virtual时,这个函数可以被他的派生类所覆盖,假如没有被覆盖,派生类中的对象想要访问这个函数的时候,将调用基类中的函数。
调用:base *p;
Der1 d1;
p = &d1;
p -> v_func();
纯虚函数与抽象类:
纯虚函数是指没有在基类中定义的虚函数。这个没有定义指的是没有函数体 即 { },而是用的 = 0 ;
一般语法:
virtual type func-name(parameter list) = 0;
一旦一个虚函数变为纯虚函数,这个时候,他的派生类必须覆盖这个纯虚函数,不然会出错。
class a_class
{
public:
virtual double v_func() = 0;
virtual int func() = 0
{
return 0;
}
};
抽象类:含有纯虚函数的类为抽象类。
作用:为多态类提供一个没有负担的接口,而接口的激活代码有派生类的覆盖函数提供。
由于抽象类中包含了很多的纯虚函数,所以不能用它来定义或者初始化对象。
尽管不能直接定义抽象类对象,但可以创建指向抽象类的指针与引用。
我们把一个函数定义为纯虚函数,然后各个从基类派生出来的派生类真正地对其进行了重新定义,满足各自的需要。
早期绑定与动态绑定
早期绑定就是静态绑定。一般在 我们编译的时候就确定需要调用某一个函数需要的所有信息,叫做早期绑定。一般包括函数的重载、正常函数的调用及重载运算符。 //发生在非虚函数的定义与基类的派生中。
动态绑定就是后期绑定,一般在 运行时才确定的函数调用。我们可以使用虚函数来实现动态绑定。
//发生在虚函数当中。
C++学习总结3