C++入门学习:纯虚函数、抽象类和模拟接口

纯虚函数

纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把明它声为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。

它的一般格式如下:
class <类名>//抽象类
{
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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值