内部类--》类的嵌套,纯虚函数和抽象类


前言

C++精准知识讲解


提示:以下是本篇文章正文内容,下面案例可供参考

一、类的大小跟static的关系

更新类的大小:类的大小由类中所有非静态成员属性的大小决定(静态成员属性不占用类的大小,因为静态成员属性存放在数据段中)

代码实例:

#include <iostream>

using namespace std;

class Animal
{
public:
	void getAnimal()
	{
		count++;
		cout<<count<<endl;
	}
private:
	int age;
	static float weight;
	static int count;  //static修饰的成员属性统计,或者用于对象之间传递数据
};
int Animal::count=0;
int main()
{
	cout<<sizeof(Animal)<<endl;
	Animal a;
	a.getAnimal();
	
	Animal b;
	b.getAnimal();
	
	Animal c;
	c.getAnimal();
}

二、多态和虚函数底层原理分析

1.原理:

第一点:只要一个类中定义了虚函数,那么这个类以及它派生出来的类都会有各自独立的虚函数表,并且创建的对象中会多出来一个指针(该指针指向虚函数表的首地址)
第二点:父类的指针或者父类的引用去调用方法的时候,其实就是去查询虚函数表

2.C++中多态可以划分为两大类

第一类:编译时多态 --》函数重载就是编译时多态
第二类:运行时多态 --》我们现在用虚函数实现的这种就是运行时多态

3.代码实例

#include <iostream>

using namespace std;
class Animal
{
public:
	virtual void eat()  //虚函数
	{
		cout<<"动物吃"<<endl;
	}
	virtual void animalSleep()  //虚函数
	{
		cout<<"动物睡觉"<<endl;
	}
	void animalRun()  //非虚函数
	{
		cout<<"动物跑"<<endl;
	}
private:
	int age;
};

class Dog:public Animal
{
public:
	virtual void eat()  //重写了父类其中一个虚函数,另一个没有重写
	{
		cout<<"狗吃骨头"<<endl;
	} 
};

class Tugou:public Dog
{
public:
	virtual void eat()
	{
		cout<<"土狗吃火腿肠"<<endl;
	}	
}; 




//C++允许 
void animalEat(Animal &animal) //希望具有通用性
{
	animal.eat();
}
int main()
{
	Dog dog;
	
 	Animal *p=&dog;
	p->eat();
	p->animalSleep(); 
	cout<<sizeof(Animal)<<endl;
	cout<<sizeof(dog)<<endl;
	
}

三、内部类----》类的嵌套

一个类的对象作为另外一个类的成员
代码实例

#include <iostream>

using namespace std;

//定义书的类
class Book
{
public:	
	Book()
	{
		
	}
	Book(string newname)
	{
		bookname=newname;
	}
private:
	string bookname;
};

//定义读者类
class Reader
{
public:
	void getBook(Book &newbook)
	{
		somebook=newbook;
	}
private:
	Book somebook;  //调用无参构造函数
};

int main()
{
	//定义一本书
	Book book("红楼梦");
	//定义一个读者
	Reader reader;
	reader.getBook(book);
}

四、纯虚函数和抽象类

1.纯虚函数

跟虚函数的关系: 纯虚函数是虚函数的一种特殊情况

 语法: virtual  函数返回值  函数名字()=0;      //纯虚函数没有任何具体代码,只有一个声明

作用: 提供一个统一接口,实现要求程序员根据自己的情况各自去实现

2.抽象类

定义:只要一个类中声明了纯虚函数,那么这个类就是抽象类
作用:跟纯虚函数配合,提供接口声明给程序员,提供给程序员提供的共同的操作接口,程序员依照统一的接口去实现各自的功能
特点:
特点一:抽象类是不能定义对象的
特点二:一个类继承了抽象类,必须实现抽象类中所有的纯虚函数,如果有一个不实现,那么子类依然是抽象类

3.代码实例

#include <iostream>

using namespace std;

class Dog;  //前向引用声明,告诉编译器我有定义这个类,定义在后面
class Cat;
class Object  //提供纯虚函数接口的
{
public:
	virtual void compare(Dog &dog)=0; //定义一个纯虚函数
	virtual void show()=0;
	
};

class Dog:public Object
{
public:
	 Dog(int _age)
	 {
		 age=_age;
	 }
	 void compare(Dog &dog)  //实现纯虚函数,根据狗的特点自己去写比较方法的代码
	 {
		if(this->age>dog.age)
			cout<<"你的狗年龄大"<<endl;
		else if(this->age<dog.age)
			cout<<"你的狗年龄小"<<endl;
		else
			cout<<"你的狗年龄跟别人的一样"<<endl;
	 }
	 void show()
	 {
		 cout<<"狗自己实现了show方法"<<endl;
	 }
private:
	int age;
	float weight;
};


int main()
{
	//Object obj;   错误,抽象类无法创建对象
	Dog dog(5);
	Dog dog1(7);
	dog.compare(dog1);
}


总结

以上就是今天要讲的内容,本文仅仅简单介绍了类的嵌套,纯虚函数和抽象类的使用,其他内容请各位大神移步本博客的其他文章,或是留言并关注博主,等待后续发布。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值