C++学习笔记----继承和多态

继承

// class 派生类 : 访问修饰符 基类1, 访问修饰符 基类2...
class Animal
{
	public:
		int mAge;
		virtual void speak()
		{
			cout<<"animal"<<endl;
		}
};
class Sheep : public Animal
{
	public:
		string* mName;
		Sheep(string name)
		{
			mName = new string("tom");
		}
		void speak()
		{
			cout<<"Sheep"<<endl;
		}
};
class Tuo : public Animal
{
	public:
		void speak()
		{
			cout<<"Tuo"<<endl;
		}
};
//多继承可能会导致菱形继承等混淆数据问题
//可以利用虚继承进行解决,使用virtual关键字在继承前,基类被称为虚基类
//这样派生类存储的是基类的虚基类指针所有子孙类共享一份数据
class SheepTuo : public Sheep, public Tuo
{
	
};

多态

class Calculator
{
	//开闭原则:可以拓展,不能修改
public:
	int mNum1;
	int mNum2;
	
	int getResult(string oper)
	{
		if("+" == oper)
		{
			return mNum1 + mNum2;
		}else if("-" == oper)
		{
			return mNum1 - mNum2;
		}else if("*" == oper)
		{
			return mNum1 * mNum2;
		}else if("/" == oper)
		{
			return mNum1 / mNum2;
		}
		return 0;
	}

private:



	
};
class AbstractCalculator
{
public:
	int mNum1;
	int mNum2;
	//virtual type function(parameterList) = 0: 
	//只有函数的声明没有实现==》纯虚函数==》其他语言的接口
	//具有纯虚函数的类是抽象类,无法进行实例化对象
	//子类必须重写纯虚函数,因为继承了纯虚函数,不重写子类也是抽象类
	virtual int getResult() = 0;
	
};
class AddCalculator : public AbstractCalculator
{
	virtual int getResult()
	{
		
		return mNum1 + mNum2;
	}
};
class SubCalculator : public AbstractCalculator
{
	virtual int getResult()
	{
		
		return mNum1 - mNum2;
	}
};
class MulCalculator : public AbstractCalculator
{
	virtual int getResult()
	{
		
		return mNum1 * mNum2;
	}
};
class DivCalculator : public AbstractCalculator
{
	virtual int getResult()
	{
		
		return mNum1 / mNum2;
	}
};
class AbstractDrinks
{
public:
	virtual void Boil() = 0;
	virtual void Brew() = 0;
	virtual void PourInCup() = 0;
	virtual void PutSomething() = 0;
	void makeDrink()
	{
		Boil();
		Brew();
		PourInCup();
		PutSomething();
	}
};
class Coffee : public AbstractDrinks
{
	virtual void Boil()
	{
		cout<<"Boil Coffee"<<endl;
		
	}
	virtual void Brew()
	{
		cout<<"Brew Coffee"<<endl;
	}
	virtual void PourInCup()
	{
		cout<<"PourInCup Coffee"<<endl;
		
	}
	virtual void PutSomething()
	{
		cout<<"PourInCup Coffee"<<endl;

	}
};
class Tea : public AbstractDrinks
{
	virtual void Boil()
	{
		cout<<"Boil Tea"<<endl;
		
	}
	virtual void Brew()
	{
		cout<<"Brew Tea"<<endl;
	}
	virtual void PourInCup()
	{
		cout<<"PourInCup Tea"<<endl;
		
	}
	virtual void PutSomething()
	{
		cout<<"PourInCup Tea"<<endl;

	}
};
class Cpu
{
public:
	virtual void cacl() = 0;
};
class Graphics
{
public:
	virtual void disply() = 0;
};
class Memory
{
public:
	virtual void storage() = 0;	
};
class Computer
{
public:
	Computer(Cpu* c, Graphics* g, Memory* m)
	{
		cpu = c;
		gra = g;
		mem = m;
	}
	void work()
	{
		cpu->cacl();
		gra->disply();
		mem->storage();
	}
private:
	Cpu* cpu;
	Graphics* gra;
	Memory* mem;
};
class IntelCpu : public Cpu
{
public:
	virtual void cacl()
	{
		cout<<"IntelCpu"<<endl;
	}
};
class IntelGraphics : public Graphics
{
public:
	virtual void disply()
	{
		cout<<"IntelGraphics"<<endl;
	}
};
class IntelMemory : public Memory
{
public:
	virtual void storage()
	{
		cout<<"IntelMemory"<<endl;
	}
};
class LenovoCpu : public Cpu
{
public:
	virtual void cacl()
	{
		cout<<"IntelCpu"<<endl;
	}
};
class LenovoGraphics : public Graphics
{
public:
	virtual void disply()
	{
		cout<<"IntelGraphics"<<endl;
	}
};
class LenovoMemory : public Memory
{
public:
	virtual void storage()
	{
		cout<<"IntelMemory"<<endl;
	}
};





void doSpeak(Animal& animal)

{
	animal.speak();
}
/*void test01()
{
	Sheep sheep;
	doSpeak(sheep);
	Tuo tuo;
	doSpeak(tuo);
}*/
void test02()
{
	cout<<"size animal: "<<sizeof(Animal)<<endl;
}
void test03()
{
	Calculator c;
	c.mNum1 = 10;
	c.mNum2 = 10;
	cout<<c.mNum1<<"+"<<c.mNum2<<"="<<c.getResult("+")<<endl;
	cout<<c.mNum1<<"-"<<c.mNum2<<"="<<c.getResult("-")<<endl;
	cout<<c.mNum1<<"*"<<c.mNum2<<"="<<c.getResult("*")<<endl;
	cout<<c.mNum1<<"/"<<c.mNum2<<"="<<c.getResult("/")<<endl;
}
void test04()
{
	//多态条件:基类的指针或者引用指向派生类的对象并且调用虚函数,动态绑定
	AbstractCalculator* ac = new AddCalculator;
	ac->mNum1 = 100;
	ac->mNum2 = 100;
	cout<<ac->mNum1<<"+"<<ac->mNum2<<"="<<ac->getResult()<<endl;
	delete ac;
	ac = new SubCalculator;
	ac->mNum1 = 100;
	ac->mNum2 = 100;
		cout<<ac->mNum1<<"+"<<ac->mNum2<<"="<<ac->getResult()<<endl;
	delete ac;
	ac = new MulCalculator;
	ac->mNum1 = 100;
	ac->mNum2 = 100;
		cout<<ac->mNum1<<"+"<<ac->mNum2<<"="<<ac->getResult()<<endl;
	delete ac;
	ac = new DivCalculator;
	ac->mNum1 = 100;
	ac->mNum2 = 100;
		cout<<ac->mNum1<<"+"<<ac->mNum2<<"="<<ac->getResult()<<endl;
	delete ac;
}
void doWork(AbstractDrinks* abs)
{
	abs->makeDrink();
	delete abs;
}
void test05()
{
	doWork(new Coffee);
	cout<<"---------------"<<endl;
	doWork(new Tea);
}
void test06()
{
	Cpu* intelCpu = new IntelCpu;
	Graphics* intelGra = new IntelGraphics;
	Memory* intelMem = new IntelMemory;
	
	Computer* computer = new Computer(intelCpu, intelGra, intelMem);
	computer->work();
	delete computer;
}










int main()
{
	
	
	test06();
	
	
	
	system("pause");
	system("cls");
	return 0;
}

posted @   万舜  阅读(12)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示