C++学习,多态与虚函数

对于c++中的虚函数,在学习虚函数之前,首先需要知道在c++中的多态的含义。

多态的含义:从字面意思上来看就是多种形态,而解释其意思就是,针对一个具体的行为,不同的人(也就是对象)来进行这个行为会有不同的结果,产生不同的状态。

举例说明,几个人干着一样的事情,例如同样干着工作,有的人干工作很快,有的人干的很慢,导致的结果就是有人受到同事的认可,有的人只能处在默默无闻的状态。这里就是不同的对象进行着同样的行为之后,但是产生的状态却不同。

而对于在c++中的多态进行分类:主要分为两种,一种是静态的多态,也可以说是函数的重载,主要就是对于一个同名函数进行重新自定义,例子如下:

int func(int a, int b)
{
return a + b;
}
double func(double a, double b) 
{
return a + b;
}

对于同名的函数func中,由于不同的形参构成,返回值也不同,一个是int型,一个是double型,所以两个同名函数构成函数重载。

而另外一种多态则是动态的多态;这里一个就是涉及到父类与子类的继承,使用父类对象的引用或者指针去调用父类和子类中的同名函数,由于父类和子类中的同名函数有各自的定义方法,所以会根据不同类的定义方法产生不同的效果。

例如:定义AClass类,其中有一个输出函数,将其作为父类

class AClass:
{ 
public:
void qDebugStr();
};
AClass::qDebugStr()
{
qDebug() << "我是A的输出";
}

定义BClass类,也是有一个同名输出函数,继承自AClass,是其子类

class BClass:public AClass { public: void qDebugStr(); }; BClass::qDebugStr() { qDebug() << "我是B的输出"; }

在主函数中使用AClass和BClass类来实例各自的对象,再通过其对象来调用输出函数,就会产生多态效果

BClass B;
AClass &A=B;
AClass *point = &B;
A.qDebugStr();
point->qDebugStr();
B.qDebugStr();

这里一个是使用引用,一个是使用指针,也就是分别使用父类AClass的引用和指针去调用同名输出函数,得到的结果为

我是A的输出
我是A的输出
我是B的输出

这里对于A.qDebugStr(),其只是引用了BClass类的对象,但是还是A类的引用,qDebugStr()仍然是A类的输出函数。而对于使用AClass定义的指针,也仍然是A类的对象,其输出函数也是A的输出函数。所以输出结果也就是如上的结果。

但是如果将AClass中的函数定义使用虚函数进行定义,虚函数定义只在类中的方法前进行虚函数的定义声明。

class AClass:
{ 
public: 
virtual void qDebugStr(); 
}; 
AClass::qDebugStr() 
{ 
qDebug() << "我是A的输出";
 }

而如上进行虚函数的定义之后,输出结果为

我是B的输出
我是B的输出 
我是B的输出

这样输出的原因是,virtual定义之后,调用的qDebugStr()方法使AClass的成员函数还是BClass的成员函数主要是取决于调用这个函数的对象是谁,A和Point所指的对象都是B,所以调用的也就是BClass的成员函数。

通过这里可以看到virtual也就是动态多态的标志,也就是使用基类(父类)的指针或引用指向其派生类对象(子类),能够调用派生类对象(子类对象)当中的同名函数,从而产生多态,也成为动态的多态。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍一下关于C++多态虚函数的实验。 首先,多态是指不同对象以不同的方式响应相同的消息的能力。在C++中,通过虚函数来实现多态虚函数是指在基类中被声明为虚函数的函数,在派生类中被重写后,在程序中使用基类指针或引用调用该函数时,会调用派生类中的函数。 下面是一个简单的多态虚函数的实验示例: ```c++ #include<iostream> using namespace std; class Shape { public: virtual void draw() { cout << "Drawing Shape" << endl; } }; class Circle: public Shape { public: void draw() { cout << "Drawing Circle" << endl; } }; class Square: public Shape { public: void draw() { cout << "Drawing Square" << endl; } }; int main() { Shape *s; Circle c; Square sq; s = &c; s->draw(); s = &sq; s->draw(); return 0; } ``` 运行结果为: ``` Drawing Circle Drawing Square ``` 在上述示例中,我们定义了一个基类Shape和两个派生类Circle和Square,分别重写了基类的虚函数draw()。在程序中,我们先定义了一个基类指针s,然后将其指向第一个派生类对象c,再调用s的虚函数draw(),此时会调用派生类Circle的draw()函数,因为指针实际上指向的是Circle类型的对象。接着,我们将指针s重新指向第二个派生类对象sq,再次调用s的虚函数draw(),此时会调用派生类Square的draw()函数。 通过这个实验,我们可以看到多态虚函数的特性,即通过基类指针或引用调用虚函数时,会根据实际对象的类型来调用相应的派生类函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值