C++虚函数多态原理-最直白的讲解

C++的主要特点是抽象,继承,封装和多态。我们先理解抽象是什么?在这之前,首先我问你C++是什么,是用来干什么的?

一切的语言都是用来描述现实世界的 ,C++也是.C++的任何特性都是为了去描述这个世界,并为其解决提供方法。但是C++还是并不能完全去描述这个世界,因为现实世界是无法完全认知的,只能不断去认知的,扯远了,感到到了哲学这段。抽象?例如现实世界的人类,书,树,桌子,椅子等名词都是一种对某些具有共同特征实体的抽象描述。感觉有点可以用集合来理解。难道每次去描述人时都是直立行走,两只眼睛,一直嘴巴?所以需要抽象来解决这个问题。因此抽象就对应了C++中的类。再比如描述人时,你还是不知道它是亚洲人,欧洲人,还是非洲人,或许是外星人?所以又出现了继承这一概念,对应人集合中的子集。封装就是对类中的信息进行分级,主要是针对类的实例来说,有些东西你可以调用,有些东西你不能调用。也就是类的设计者并不想让类的实例为所欲为。突然想到人到底有没有灵魂一说呢?假如上帝是人类的设计者,每个人就是一个实例,将灵魂属性进行隐藏,你又如何知道它的存在呢?或许只有对实例代码进行研究透,搞明白任何原理才知道吧。

定义下多态的含义:

通过父类类型的指针或者引用指向子类对象。通过该指针或者引用就可以实现只能调用子类的虚函数以及继承父类的函数,而无法对子类其它的函数进行调用的功能。

先来讨论一下子类和父类的关系?先讨论函数。

子类会继承父类的成员变量和成员函数,同时子类也可以有自己的成员函数和成员变量。如果子类的成员变量的名称和父类的成员变量名称一样,调用子类实例时,是调用父类变量还是子类变量呢?如果不加作用域的情况下,调用子类变量。这是隐藏。子类将父类的变量隐藏了。同样:如果子类的成员函数的名称和父类的成员函数名称一样时,尽管返回值或者参数类型,参数个数也不一样,调用子类实例时,父类的同名成员函数均会被隐藏,无法调用。至于如果子类有多个成员函数的名称一样,其他不同,则他们彼此之间的关系为重载。根据参数类型,返回值类型而调用不同的成员函数。

假如现在有一个函数:输入为人类型比如亚洲或者欧洲或者非洲啊,输出为该人类型的肤色,那如何传参数呢?形参如何写呢?第一种是对该函数进行重载,这样会很浪费代码。

第二种就是用多态了,利用子类和父类之间的多态性来解决,来对应形参和实参之间的关系。形参为父类实例引用,实参为子类实例,这样调用的虚函数就对应了相应实参类型的虚函数。

代码如下:

class CBse
{
public:
    virtual void f1(){}
};
class CDerive1 : public CBse
{
public:
	 void f1()
	{
		cout << "Derive1" << endl;
	}
};
class CDerive2 : public CBse
{
public:
	 void f1()
	{
		cout << "Derive2" << endl;
	}
};
void test(CBase &cbase)
{
    cbase.f1();
}
int main()
{
	CDerive1 test1;
    CDerive1 test2;
    test(test1);
    test(test2);
	
}

这样定义的话就会涉及到类类型转换问题,通过父类类型的指针或者引用指向子类对象,即这样,指针或者引用到底指向什么呢?

猜你喜欢

转载自blog.csdn.net/u013070875/article/details/81701157