2020-01-09 15:57:56 weixin_42579072 阅读数 56
  • C++语言基础视频教程

    C++语言基础视频培训课程:本课与主讲者在大学开出的程序设计课程直接对接,准确把握知识点,注重教学视频与实践体系的结合,帮助初学者有效学习。本教程详细介绍C++语言中的封装、数据隐藏、继承、多态的实现等入门知识;主要包括类的声明、对象定义、构造函数和析构函数、运算符重载、继承和派生、多态性实现等。 课程需要有C语言程序设计的基础(可以利用本人开出的《C语言与程序设计》系列课学习)。学习者能够通过实践的方式,学会利用C++语言解决问题,具备进一步学习利用C++开发应用程序的基础。

    210450 人正在学习 去看看 贺利坚

之前我们写过c++之虚函数表及多态,讨论了存在虚函数时的虚函数表变化及继承关系。今天讨论一下类的对象的存储方式。其中参考C++类对象的内存结构

一、类对象内存结构

因为静态成员属于整个类,在类实例化对象之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间

在c++基类中,如果存在虚函数,那么它就会有一个指向虚函数表的指针vptr(vptr具体在什么位置,与编译器有关,大多数都在开始处),之后是类的成员的内存数据。而对于子类,最开始的内存数据记录着父类对象的拷贝(包括父类虚函数表指针和成员变量),之后才是自己的成员的内存数据。至于虚函数表的变化,可以参考c++之虚函数表及多态
在这里插入图片描述
例如存在一个虚函数继承:

class Base 
{ 
public: 
    virtual void f() { cout << “Base::f” << endl; } 
    virtual void g() { cout << “Base::g” << endl; } 
    virtual void h() { cout << “Base::h” << endl; } 
    int base; 
protected: 
private: 
}; 
class Child2 : public Base 
{ 
public: 
    virtual void f() { cout << “Child2::f” << endl; } 
    virtual void g1() { cout << “Child2::g1” << endl; } 
    virtual void h1() { cout << “Child2::h1” << endl; } 
    int child2; 
protected: 
private: 
}; 

在这里插入图片描述
二、对象不能实现多态

在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<string>

using namespace std;

class base
{
public:
	virtual ~base() { cout << "析构基类" << endl; };
	virtual string GetName() { return "base"; }
	void GetA() { cout << "Base::GetA" << endl; };
	int a=1;
};

class derived : public base
{
public:
	virtual ~derived() { cout << "析构子类" << endl; };
	virtual string GetName() { return "derived"; }
	void GetB() { cout << "Derived::GetB" << endl; };
	int a = 100;
	int b = 200;
};

int main()
{
	base B1;
	base *B2 = new base();
	derived D1;

	//子类对象可以给父类对象赋值,而父类对象不能给子类对象赋值
	B1 = D1;
	B1.GetA();
	cout << B1.GetName() << endl;
	//即使赋值操作,基类的a并没有被子类的a所覆盖。
	cout << "a = " << B1.a << endl;
	//delete[] B1;

	B2 = new derived();
	B2->GetA();
	//只有这一个体现了多态(虚函数继承),指针和引用才能实现多态。
	cout<<B2->GetName()<<endl;
	cout << "a = " << B2->a << endl;
	delete B2;
	
	system("pause");
}

在这里插入图片描述
结论:无论赋值操作还是赋值构造时,一个类对象里面的vptr永远不会变,永远都会指向 所属类 的虚函数表。而当使用指针或者引用时,vptr会指向 继承类 的虚函数表。

2019-11-22 17:19:49 tkwxty 阅读数 58
  • C++语言基础视频教程

    C++语言基础视频培训课程:本课与主讲者在大学开出的程序设计课程直接对接,准确把握知识点,注重教学视频与实践体系的结合,帮助初学者有效学习。本教程详细介绍C++语言中的封装、数据隐藏、继承、多态的实现等入门知识;主要包括类的声明、对象定义、构造函数和析构函数、运算符重载、继承和派生、多态性实现等。 课程需要有C语言程序设计的基础(可以利用本人开出的《C语言与程序设计》系列课学习)。学习者能够通过实践的方式,学会利用C++语言解决问题,具备进一步学习利用C++开发应用程序的基础。

    210450 人正在学习 去看看 贺利坚

        C++中类的虚函数和纯虚函数以及实例化


   让我们来继续学习C++的一些基本语法知识,今天我们要讲解的是C++中虚函数和纯虚函数。这个也可以说是C++的精华了,因为C++的实现多态就是靠的这个。

(1).含有虚函数的类是可以被实例化的,下面来直接上代码和运行结果:

class VirtualClass{
	public:
		virtual void fun1()
		{
			printf("VirtualClass\n");
		};
		virtual ~VirtualClass();
};


int main(){
	VirtualClass * virtualClass = new VirtualClass();
	virtualClass->fun1();
	return 0;
}

//打印结果如下:
A920:/system/bin # ./VirtualClass
This VirtualClass fun1
A920:/system/bin #

(2).含有纯虚函数的类是不可以被实例化的,必须被继承,才能够被实例化,下面直接上演示代码来说明:

class VirtualClass{
	public:
		virtual void fun1() = 0;//纯虚函数

		virtual ~VirtualClass();
};



class ClassA : public VirtualClass{
	public:
		void fun1(){
			printf("The is ClassA fun1\n");
		};

		virtual ~ClassA();
		
};


VirtualClass:: ~VirtualClass(){
}

ClassA:: ~ClassA(){
}

int main(){
	//编译报错,这个非法的
	VirtualClass * virtualClass = new VirtualClass();//error: cannot allocate an object of abstract type 'VirtualClass'
	
	VirtualClass * classA = new ClassA();
	classA->fun1();
	return 0;
}


   最后总结一把,C++中含有虚函数的类是可以实例化的,含有纯虚函数的类只能被继承,不能被实例化。

2011-02-16 15:21:00 ayheos 阅读数 819
  • C++语言基础视频教程

    C++语言基础视频培训课程:本课与主讲者在大学开出的程序设计课程直接对接,准确把握知识点,注重教学视频与实践体系的结合,帮助初学者有效学习。本教程详细介绍C++语言中的封装、数据隐藏、继承、多态的实现等入门知识;主要包括类的声明、对象定义、构造函数和析构函数、运算符重载、继承和派生、多态性实现等。 课程需要有C语言程序设计的基础(可以利用本人开出的《C语言与程序设计》系列课学习)。学习者能够通过实践的方式,学会利用C++语言解决问题,具备进一步学习利用C++开发应用程序的基础。

    210450 人正在学习 去看看 贺利坚

C++的类成员如果有Virtual修饰符,则在实例化后的对象中会形成一个叫做VTBL(虚拟表)的东西,另外借助C++内在的滞后绑定功能实现所谓的多态性。下面,我借助C代码来大概演示下VTBL的实现原理,仅供参考。

 

 

2019-04-02 21:46:46 claroja 阅读数 22
  • C++语言基础视频教程

    C++语言基础视频培训课程:本课与主讲者在大学开出的程序设计课程直接对接,准确把握知识点,注重教学视频与实践体系的结合,帮助初学者有效学习。本教程详细介绍C++语言中的封装、数据隐藏、继承、多态的实现等入门知识;主要包括类的声明、对象定义、构造函数和析构函数、运算符重载、继承和派生、多态性实现等。 课程需要有C语言程序设计的基础(可以利用本人开出的《C语言与程序设计》系列课学习)。学习者能够通过实践的方式,学会利用C++语言解决问题,具备进一步学习利用C++开发应用程序的基础。

    210450 人正在学习 去看看 贺利坚

c++支持编译时多态(静态多态)和运行时多态(动态多态),运算符重载和函数重载就是编译时多态,派生类和虚函数实现运行时多态。

virtual关键字加在要多态的函数上
父类的引用或者指针执行之类的对象

重写必须返回值,参数个数,类型,顺序都相同.

Animal * animal = new Cat;
animal.speak();

有纯虚函数的父类,无法被实例化,这样的类被称为抽象类.
纯虚函数必须要被子类重写

在多态的时候,普通析构,是不会调用子类的析构的,可能会导致释放不干净,需要用虚析构函数解决.

纯析构函数,类内声明,类外实现

向上转型和向下转型

向下转型 基类转派生类 不安全 因为指针的范围大于原来的内存大小
向上转型 派生类转基类 安全 因为指针的范围小于原来的内存大小
如果发生多态,都是安全的

2019-12-22 00:09:55 weixin_43796685 阅读数 14
  • C++语言基础视频教程

    C++语言基础视频培训课程:本课与主讲者在大学开出的程序设计课程直接对接,准确把握知识点,注重教学视频与实践体系的结合,帮助初学者有效学习。本教程详细介绍C++语言中的封装、数据隐藏、继承、多态的实现等入门知识;主要包括类的声明、对象定义、构造函数和析构函数、运算符重载、继承和派生、多态性实现等。 课程需要有C语言程序设计的基础(可以利用本人开出的《C语言与程序设计》系列课学习)。学习者能够通过实践的方式,学会利用C++语言解决问题,具备进一步学习利用C++开发应用程序的基础。

    210450 人正在学习 去看看 贺利坚

C++多态

抽象类

定义

在面向对象的概念中,所有的对象都是通过类来描述的,但是,反过来,并不是所有的类都是用来描述对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是一个抽象类。
C++中使用纯虚函数的方式来实现抽象类的功能

C++实现抽象类方式

在纯虚函数的后面跟上=0,则这个函数为纯虚函数。包含纯虚函数的类称之为抽象类(接口类),抽象类不能实例化对象因为抽象类中没有具体的方法,所以无法实例化对象,派生类继承之后也不能实例化对象,只有将基类中的抽象类重写了,才能实例化对象。

class A
{
	virtual void Func() = 0;
};

int main()
{
	A a; //error
}

在这里插入图片描述
抽象类多态继承的方式

class A
{
	virtual void Func() = 0;
};

class B : public A
{
public:
	virtual void Func()
	{
		cout << "virtual B::Func()" << endl;
	}
};

int main()
{
	B b;
}

C++11新增特性

override & final
  • 当使用override来修饰虚函数时:表修饰派生类虚函数进行强制重写虚函数
class A
{
public:
	virtual void Func() = 0;
};

class B : public A
{
public:
	virtual void Func() override //表示强制重写虚函数
	{
		cout << "virtual B::Func()" << endl;
	}
};

int main()
{
	A *b = new B();
	b->Func(); //编译器会首先检测其静态类型是否合法
}
  • 当使用final来修饰虚函数时:表示修饰虚函数不可以在被派生类所重写
class A
{
public:
	virtual void Func() = 0;
};

class B : public A
{
public:
	virtual void Func() final //表示禁止再被重写
	{
		cout << "virtual B::Func()" << endl;
	}
};

class C : public B
{
public:
	virtual void Func() //error
	{
		cout << "virtual C::Func()" << endl;
	}
};

在这里插入图片描述

C++中的多态问题

阅读数 311

C++多态

阅读数 227

C++多态实现机制

阅读数 640

C++ 模板

阅读数 19

没有更多推荐了,返回首页