1、基本概念
2抽象类案例
#include "iostream"
using namespace std;
class Figure //含有纯虚函数叫抽象类
{
public:
//约定一个统一的界面和接口,让子类使用,让子类必须去实现
virtual void getArea()=0; //纯虚函数
protected:
private:
};
class Circle : public Figure
{
public:
Circle(int a,int b)
{
this->a=a;
this->b=b;
}
virtual void getArea()
{
cout<<"圆的面积: "<<3.14*a*a<<endl;
}
protected:
private:
int a;
int b;
};
class Tri : public Figure
{
public:
Tri(int a,int b)
{
this->a=a;
this->b=b;
}
virtual void getArea()
{
cout<<"三角形的面积: "<<0.5*a*b<<endl;
}
protected:
private:
int a;
int b;
};
class Square : public Figure
{
public:
Square(int a,int b)
{
this->a=a;
this->b=b;
}
virtual void getArea()
{
cout<<"四边形的面积: "<<a*b<<endl;
}
protected:
private:
int a;
int b;
};
void objplay(Figure *base)
{
base->getArea(); //会发生多态
}
void main()
{
//Figure f;//抽象类不能被实例化
Figure *base=NULL;
Circle c1(10,20);
Tri t1(20,30);
Square s1(40,50);
//面向抽象类编程(面向一套预先定义好的接口编程)
objplay(&c1);
objplay(&t1);
objplay(&s1);
cout<<"hello..."<<endl;
system("pause");
return ;
}
3抽象类在多继承中的应用
3.1有关多继承的说明
- 工程上的多继承
被实际开发经验抛弃的多继承
工程开发中真正意义上的多继承是几乎不被使用的
多重继承带来的代码复杂性远多于其带来的便利
多重继承对代码维护性上的影响是灾难性的
在设计方法上,任何多继承都可以用单继承代替 - 多继承中的二义性和多继承不能解决的问题
#include "iostream"
using namespace std;
class B
{
public:
int b;
protected:
private:
};
class B1 : virtual public B
{
public:
int b1;
protected:
private:
};
class B2: virtual public B
{
public:
int b2;
protected:
private:
};
class C : public B1, public B2
{
public:
int c;
protected:
private:
};
void main()
{
C myc;
myc.c=10;
myc.b=100;
cout<<"hello..."<<endl;
system("pause");
return ;
}
3.2多继承的应用场景
绝大多数面向对象语言都不支持多继承
绝大多数面向对象语言都支持接口的概念
C++中没有接口的概念
C++中可以使用纯虚函数实现接口
接口类中只有函数原型定义,没有任何数据的定义。
class Interface
{
public:
virtual void func1() = 0;
virtual void func2(int i) = 0;
virtual void func3(int i) = 0;
};
实际工程经验证明
多重继承接口不会带来二义性和复杂性等问题
多重继承可以通过精心设计用单继承和接口来代替
接口类只是一个功能说明,而不是功能实现。
子类需要根据功能说明定义功能实现。
#include "iostream"
using namespace std;
class Interface1
{
public:
virtual int add(int a,int b)=0;
virtual void print()=0;
protected:
private:
};
class Interface2
{
public:
virtual int mult(int a,int b)=0;
virtual void print()=0;
protected:
private:
};
class Parent
{
public:
int getA()
{
a=0;
return a;
}
protected:
private:
int a;
};
class Child : public Parent , public Interface1 , public Interface2
{
public:
virtual int add(int a,int b)
{
cout<<"Child:add()已经执行"<<a<<"+"<<b<<"="<<a+b<<endl;
return a+b;
}
virtual void print()
{
cout<<"Child:print()已经执行"<<endl;
}
virtual int mult(int a,int b)
{
cout<<"Child:mult()已经执行"<<a<<"*"<<b<<"="<<a*b<<endl;
return a*b;
}
protected:
private:
};
void main()
{
Child c1;
c1.print();
Interface1 *it1=&c1;
it1->add(1,2);
Interface2 *it2=&c1;
it2->mult(3,6);
cout<<"hello..."<<endl;
system("pause");
return ;
}
转载:https://blog.csdn.net/weixin_44470443/article/details/102470327
查看评论