纯虚函数
纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把明它声为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。
它的一般格式如下:
class <类名>//抽象类
{
virtual <类型><函数名>(<参数表>)=0;//纯虚函数
…
};
{
virtual <类型><函数名>(<参数表>)=0;//纯虚函数
…
};
抽象类
拥有纯虚函数的类叫做抽象类
抽象类的特点:
1、抽象类不能实例化对象(不能定义对象),但是可以声明指针和引用(用来操作派生类对象)
2、如果一个类继承了抽象类,那么这个类必须实现抽象类的所有纯虚函数。只要有一个纯虚函数没有实现,那么这个派生类也就会变成抽象类。
具体事例:
#include <iostream>
using namespace std;
class Sharp
{
public:
virtual double getS() = 0;
};
class Circl:public Sharp
{
public:
Circl(int r)
{
this->r = r;
}
virtual double getS()
{
return 3.14*r*r;
}
private:
int r;
};
class Rectangle: public Sharp
{
public:
Rectangle(int a, int b)
{
this->a = a;
this->b = b;
}
virtual double getS()
{
return a*b;
}
private:
int a;
int b;
};
void func(Sharp *ps)
{
cout << "面积: " << ps->getS() << endl;
}
int main()
{
//Sharp s;抽象类不能实例化对象
Circl c(2);
func(&c);
Rectangle r(1,2);
func(&r);
return 0;
}
模拟接口
在C++中没有Java中的接口概念,抽象类可以模拟Java中的接口。
用抽象类模拟接口:抽象类中只有纯虚函数,没有成员变量和其他函数。
多继承可以通过单继承和继承多个接口来代替
被实际开发经验抛弃的多继承
工程开发中真正意义上的多继承是几乎不被使用的
多重继承对代码维护性上的影响是灾难性的
在设计方法上,任何多继承都可以用单继承代替
C++中可以使用纯虚函数实现接口
接口类中只有函数原型定义。
class Interface
{
public:
virtual void func1() = 0;
virtual void func2(int i) = 0;
virtual void func3(int i) = 0;
};
继承多个接口不会向多继承一样产生二义性,因为在派生类中虚函数在虚函数表中只有一个,虚函数唯一,调用的时候不会产生二义性。
eg:
#include <iostream>
using namespace std;
class interface_add
{
public:
virtual void add() = 0;
virtual void show() = 0;
};
class interface_mul
{
public:
virtual void mul() = 0;
virtual void show() = 0;
};
class Operator:public interface_add, public interface_mul
{
public:
Operator(int a, int b)
{
this->a = a;
this->b = b;
}
virtual void add()
{
res = a+b;
}
virtual void mul()
{
res = a*b;
}
virtual void show()
{
cout << "res = " << res << endl;
}
private:
int a;
int b;
int res;
};
void add(interface_add *pa)
{
pa->add();
pa->show();
}
void mul(interface_mul *pm)
{
pm->mul();
pm->show();
}
int main()
{
Operator ope(1,2);
add(&ope);
mul(&ope);
return 0;
}