- 纯虚函数和抽象类
- 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本
- 纯虚函数为各派生类提供一公共界面,(接口的封装和设计,软件的模块功能划分)
- 纯虚函数说明形式
- virtual 类型 函数名(参数表) =0;
- 一个具有纯虚函数的基类称为抽象类
- 虚函数类不可以直接建立对象,但是可以建立类指针
返回值可以是指针或者引用, 但是不可以是抽象元素
-
#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<<"圆形的面积"<<a*a*3.14<<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; }; 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; }; //构造一个方法,给多态提供方法 void showlife(Figure *f){ f->getArea(); } void main(){ //Figure p;//报错,抽象类不能被实例化 Figure *base = NULL;//声明指针是可以的 Circle c1(10,20); Tri t1(3,4); Square s1(6,6); //面向抽象接口编程 showlife(&c1); showlife(&t1); showlife(&s1); cout<<"hello"<<endl; system("pause"); return ; }
- 有关多继承的说明
- 工程上的多继承
- 被实际开发经验抛弃的多继承
- 工程开发中真正意义上的多继承是几乎不被使用的
- 多重继承带来的代码复杂性远多于其带来的便利
- 多重继承对代码维护性上的影响是灾难性的
- 在设计方法上,任何多继承都可以用单继承代替
- C++中是否有java中的接口概念?
- 绝大多数面向对象语言都不支持多继承
- 绝大多数面向对象语言都支持接口的概念
- c++中没有接口概念
- c++中可以使用纯虚函数实现接口
- 接口类只定义函数原型,不定义任何数据
- 多重继承接口不会带来二义性和复杂性等问题
#include <iostream>
using namespace std;
class Interface1
{
public:
virtual int add(int a,int b )=0;
virtual void print()=0;
};
class Interface2
{
public:
virtual int multi(int a,int b)=0;
virtual void print()=0;
};
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()"<<endl;
return a+b;
}
virtual void print()
{
cout<<"child print()"<<endl;
}
virtual int multi(int a,int b)
{
cout<<"child multi()"<<endl;
return a*b;
}
protected:
private:
};
void main(){
Child c1;
c1.print();
Interface1 *i1 = &c1;
i1->add(1,2);
Interface2 *i2 = &c1;
i2->multi(4,4);
cout<<"hello"<<endl;
system("pause");
return ;
}
- 代码复用,可拓展
-
#include <iostream> using namespace std; class programmer { public: virtual void getSal()=0; }; class juniorp:public programmer { public: juniorp(char *name,char *job,int sal) { this->name = name; this->job = job; this->sal = sal; } virtual void getSal() { cout<<name<<" "<<job<<" "<<sal<<endl; } protected: private: char *name; char *job; int sal; }; class mid_programmer:public programmer { public: mid_programmer(char *name,char *job,int sal) { this->name = name; this->job = job; this->sal = sal; } virtual void getSal() { cout<<name<<" "<<job<<" "<<sal<<endl; } protected: private: char *name; char *job; int sal; }; class adv_programmer:public programmer { public: adv_programmer(char *name,char *job,int sal) { this->name = name; this->job = job; this->sal = sal; } virtual void getSal() { cout<<name<<" "<<job<<" "<<sal<<endl; } protected: private: char *name; char *job; int sal; }; class architect:public programmer { public: architect(char *name,char *job,int sal) { this->name = name; this->job = job; this->sal = sal; } virtual void getSal() { cout<<name<<" "<<job<<" "<<sal<<endl; } protected: private: char *name; char *job; int sal; }; void CalProSal(programmer *base){ base->getSal(); } void main(){ mid_programmer mp("yj","中级程序员",8600); juniorp jp("zk","初级程序员",3000); adv_programmer ap ("hz","高级程序员",50000); architect at("qp","架构师",100000); CalProSal(&jp); CalProSal(&ap); CalProSal(&mp); CalProSal(&at); cout<<"hello"<<endl; system("pause"); return ; }