请教,父类中如何调用子类中的虚函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教,父类中如何调用子类中的虚函数相关的知识,希望对你有一定的参考价值。

参考技术A 定义父类的指针指向子类,例如:
A pobj= new B;
pobj->fun();
就是调用的子类方法,或者建立引用类型也可以
参考技术B 如果虚函数只是存在于子类,这问题就是完全天方夜谭啊!
如果是同时存在,那直接调就是

c++中的虚函数

父类 FC  FatherClass   子类 SC   SonClass

  

一 ,虚函数

C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现子类可以重写父类的虚函数实现子类的特殊化。

  如下就是一个父类中的虚函数:

class FC
{
public:
    virtual void out2(string s)
    {
        cout<<"A(out2):"<<s<<endl;
    }
};

二 ,纯虚函数  

  C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。

  C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。

  C++中的纯虚函数也是一种“运行时多态”。

  如下面的类包含纯虚函数,就是“抽象类”:

class FC
{
public:
    virtual void out1(string s)=0;
    virtual void out2(string s)
    {
        cout<<"A(out2):"<<s<<endl;
    }
};

 三 ,普通函数

  普通函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”类对象,调用自己的普通函数

  普通函数是父类为子类提供的“强制实现”。

  因此,在继承关系中,子类不应该重写父类的普通函数,因为函数的调用只和类对象的字面值有关。

实例

 

在类对象的定义中,有四种组合,

  1. FC fc=new FC;
  2. FC fc = new SC;
  3. SC sc=new SC;
  4. SC sc =new FC;

其中 4 是错误的,不允许将一个父类对象,赋值给子类对象。

但允许,将一个子类对象,赋值给父类对象,如1 中所示。

当然不,这里的列子 在3中也是不成立的,因为如果FC中包含纯虚函数,那么其实一个抽象类,不能使用抽象类来new 一个对象、

 

验证程序,如下:

 1 //============================================================================
 2 // Name        : vf.cpp
 3 // FCuthor      : lian
 4 // Version     :
 5 // Copyright   : Your copyright notice
 6 // Description : Hello World in C++, FCnsi-style
 7 //============================================================================
 8 
 9 #include <iostream>
10 using namespace std;
11 
12 
13 class FC
14 {
15 public:
16     virtual void out1()=0;  ///由子类实现
17     virtual ~FC(){};
18     virtual void out2() ///默认实现
19     {
20         cout<<"FC(out2)"<<endl;
21     }
22     void out3() ///强制实现
23     {
24         cout<<"FC(out3)"<<endl;
25     }
26 };
27 
28 class SC:public FC
29 {
30 public:
31     virtual ~SC(){};
32     void out1()
33     {
34         cout<<"SC(out1)"<<endl;
35     }
36     void out2()
37     {
38         cout<<"SC(out2)"<<endl;
39     }
40     void out3()
41     {
42         cout<<"SC(out3)"<<endl;
43     }
44 };
45 
46 int main()
47 {
48     FC *fs=new SC;
49     fs->out1();
50     fs->out2();
51     fs->out3();
52     cout<<"************************"<<endl;
53     SC *ss=new SC;
54     ss->out1();
55     ss->out2();
56     ss->out3();
57 
58     delete fs;
59     delete ss;
60     return 0;
61 }

在Line 51中 fs->out3,这里是普通函数,只会根据指针或引用的“字面值”类对象,调用自己的普通函数

所以其调用父类的普通函数,输出 FC(out3)

 

 

程序的输出结果为

SC(out1)
SC(out2)
FC(out3)
************************
SC(out1)
SC(out2)
SC(out3)

  

 

以上是关于请教,父类中如何调用子类中的虚函数的主要内容,如果未能解决你的问题,请参考以下文章

c++中的虚函数

虚函数中的继承关系

delphi中覆盖override父类的静态方法和虚函数有啥不同?

C++子类如何调父类的虚函数

如何能避免在调用子类对象的虚函数时调用父类的虚函数呢?

C++中,子类会继承父类的虚函数表!对于父类的析构函数(虚函数) 也会继承吗?