小言_互联网的博客

C++基础——纯虚函数和抽象类

523人阅读  评论(0)

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场