c++之多态和虚函数(二)

一、虚函数的重载特性

1、在派生类中重载基类的虚函数要求函数名、返回类型、参数个数、参数类型和顺序完全相同

2、如果仅仅返回类型不同,C++认为是错误重载

3、如果函数原型不同,仅函数名相同,丢失虚特性

4、举例

class derived : public  base

{ public :

     void  vf1 ( ) ;                // 虚函数

     void  vf2 ( int ) ;         // 重载,参数不同,虚特性丢失

     char  vf3 ( ) ;                // error,仅返回类型不同

     void f ( ) ;               // 非虚函数重载

 };

void g ( )

{ derived   d ;

  base  * bp = & d ;        // 基类指针指向派生类对象

  bp -> vf1 ( ) ;              // 调用 deriver ::vf1 ( )

  bp -> vf2 ( ) ;              // 调用 base ::vf2 ( )

  bp -> f ( ) ;          // 调用 base :: f( )

} ;

二、虚析构函数

1、构造函数不能是虚函数。建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数

2、析构函数可以是虚的。虚析构函数用于指引delete 运算符正确析构动态对象

3、举例

#include<iostream>

using namespace std ;

class A

 {public:

       ~A(){ cout << "A::~A() is called.\n" ; }

 };

class B : public A

 {public:

       ~B(){ cout << "B::~B() is called.\n" ; }

} ;

int main() {

    A *Ap = new B ;   

   B *Bp2 = new B ;

   cout << "delete first object:\n" ;

   delete Ap;

   cout << "delete second object:\n" ;

   delete Bp2 ;

}

三、几点注意事项

1.派生类应该从它的基类公有派生。?

2.必须首先在基类中定义虚函数。

3.派生类对基类中声明虚函数重新定义时,关键字virtual可以不写。

4.一般通过基类指针访问虚函数时才能体现多态性。

5.一个虚函数无论被继承多少次,保持其虚函数特性。

6.虚函数必须是其所在类的成员函数,而不能是友元函数,也不能是静态函数。

7.构造函数、内联成员函数、静态成员函数不能是虚函数。

(虚函数不能以内联的方式进行处理)

8.析构函数可以是虚函数,通常声明为虚函数。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值