虚函数总结
虚函数体现了多态,用virtual修饰 例 virtual viod add(int a,int b);
虚函数类型返回值参数必须相同。虚函数就是定义了基类的指针指向子类从而实现函数的多态,从而实现同种函数的不同功能。虚函数相当于一个入口多个出口 基类的虚函数是入口,通过指向子类实现不同的出口;
1:一般的话 虚函数只需在基类定义就行,但为了便于阅读 在子类也重新覆盖定义;
2:定义虚函数指针时不能出现矛盾
如下(可以理解成 用啥定义就在指向子类的里面找定义的部分)
#include
using namespace std;
class base{
public:
virtual void a(){ cout<<“a() in base\n”;}
virtual void b(){ cout<<“b() in base\n”;}
virtual void c(){ cout<<“c() in base\n”;}
virtual void d(){ cout<<“d() in base\n”;}
virtual void e(){ cout<<“e() in base\n”;}
virtual void f(){ cout<<“f() in base\n”;}
};
class A:public base{
public:
virtual void a(){ cout<<“a() in A\n”;}
virtual void b(){ cout<<“b() in A\n”;}
virtual void f(){ cout<<“f() in A\n”;}
};
class B:public base{
public:
virtual void a(){ cout<<“a() in B\n”;}
virtual void b(){ cout<<“b() in B\n”;}
virtual void c(){ cout<<“c() in B\n”;}
};
class C:public A,public B{
public:
virtual void a(){ cout<<“a() in C\n”;}
virtual void d(){ cout<<“d() in C\n”;}
};
int main()
{
C cc;
//base *pa=&cc;//错误 c中有两个基类 用base 来定义的话不知道指向那个
A *pa=&cc;//所以用A 或B 都行
pa->a();
pa->b();
pa->c();
pa->d();
pa->e();
pa->f();
}
如果继承重复可以继承时在重复的地方虚类继承
#include
using namespace std;
class base{
public:
virtual void a(){ cout<<“a() in base\n”;}
virtual void b(){ cout<<“b() in base\n”;}
virtual void c(){ cout<<“c() in base\n”;}
virtual void d(){ cout<<“d() in base\n”;}
virtual void e(){ cout<<“e() in base\n”;}
virtual void f(){ cout<<“f() in base\n”;}
};
class A:virtual public base{
public:
virtual void a(){ cout<<“a() in A\n”;}
virtual void b(){ cout<<“b() in A\n”;}
virtual void f(){ cout<<“f() in A\n”;}
};
class B:virtual public base{
public:
virtual void a(){ cout<<“a() in B\n”;}
virtual void b(){ cout<<“b() in B\n”;}
virtual void c(){ cout<<“c() in B\n”;}
};
class C:public A,public B{
public:
virtual void a(){ cout<<“a() in C\n”;}
virtual void d(){ cout<<“d() in C\n”;}
};
int main()
{
C cc;
base *pa=&cc;/ /virtual 继承的话不子类会有重复的继承
pa->a();
pa->b();
pa->c();
pa->d();
pa->e();
pa->f();
}
3:纯虚数
纯虚数的格式为
虚函数只起到入口的作用其本身没有功能.
因为其不能实现功能所以基类叫做抽象类,抽象类不能当作对象 。