- 抽象类:含有纯虚函数的类,不能实例化对象
- 接口类:仅含有纯虚函数的抽象类
- 聚合类:用户可以直接访问其成员,并且具有特殊的初始化语法形式。满足如下特点:
1)所有成员都是 public,没有私有和受保护的非静态成员;
2)没有定义任何构造函数;
3)没有类内初始化;
4)没有基类,也没有 virtual 函数
// 接口类
class A
{
virtual void printA() = 0; // 纯虚函数
};
// 抽象类
class AA:public A
{
public:
// 覆写接口类的纯虚函数
void printA() override
{
cout << "class AA printA()" << endl;
}
virtual void printAA() = 0;
};
// 可实例化的类
class B:public AA
{
public:
// 覆写父类(抽象类)的纯虚函数
void printAA() override
{
cout << "class B printAA()" << endl;
}
void printB()
{
cout << "printB()" << endl;
}
};
// 聚合类
class C
{
public:
int x;
int y;
void print(){
cc();
}
private:
void cc(){
cout << "x = " << x << ", y = " << y << ", z = " << z << endl;
}
static int z;
};
int C::z = 0;
class D
{
public:
int a;
int b;
C c;
void print(){
cout << "a = " << a << ", b = " << b << endl;
c.print();
}
};
int main( )
{
B b;
b.printA();
b.printB();
// 初始化聚合类
D d = {1, 2, {3, 4}};
d.print();
return 0;
}
输出:
Start
class AA printA()
class B printAA()
printB()
a = 1, b = 2
x = 3, y = 4, z = 0
0
Finish
既然有抽象类,为什么要用接口呢?
- 接口带来的最大好处就是避免了多继承带来的复杂性和低效性,并且同时可以提供多重继承的好处
- 抽象类对事物进行抽象,更多的是为了继承,为了扩展,为了实现代码的重用,子类和父类之间体现的是is-a关系
- 接口则更多的体现一种行为约束,一种规则,一旦实现了这个接口,就要给出这个接口中所有方法的具体实现,也就是说实现类对于接口中所有的方法都是有意义的
- 接口用于抽象事物的特性,抽象类用于代码复用