加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在子类中重载虚拟函数

发布时间:2020-12-16 07:53:24 所属栏目:百科 来源:网络整理
导读:我只是用c中的虚拟关键字和继承概念进行测试. 我写了一个小程序: #includestdio.h#includeiostreamusing namespace std;class cna_MO{ public: virtual void print() { cout "cna_MO" endl; }};class cna_bsc:public cna_MO{ public: void print() { cna_MO
我只是用c中的虚拟关键字和继承概念进行测试.
我写了一个小程序:
#include<stdio.h>
#include<iostream>

using namespace std;

class cna_MO
{
  public:
    virtual void print()
    {
        cout << "cna_MO" << endl;
    }
};

class cna_bsc:public cna_MO
{
  public:
    void print()
    {
        cna_MO::print();
    }

    void print(int a)
    {
        cout << "cna_BSC" << endl;
    }
};

class cna_Mo
{
    cna_MO *_mo;

  public:
    cna_Mo()
    {
        _mo = new cna_bsc;
    }

    virtual void print(int a)
    {
        cout << "cna_Mo with arg" << endl;
        _mo->print(5);
    }

    virtual void print()
    {
        cout << "cna_Mo" << endl;
        _mo->print();
    }
};

int main()
{
    cna_Mo valid_mo;
    cout << "old case is started" << endl;
    valid_mo.print();
    cout << "new case is started" << endl;
    valid_mo.print(5);
    return 0;
}

我在这里做的是我已经重载了一个虚拟函数在父类中的子类!这不是正确的事吗?

我收到的编译错误如下:

“temp10.cc”,line 45: Error: Too many arguments in call to “cna_MO::print()”.

解决方法

一旦从Derived类中的Base类重载了一个函数,Base类中所有具有相同名称的函数都将被隐藏在Derived类中.

一旦将函数cna_bsc :: print(int a)添加到派生类中,则派生类的用户不再可以看到函数cna_MO :::: print().这被称为功能隐藏.

解:
为了使隐藏的函数在派生类中可见,您需要添加:

using cna_MO::print;

在你的派生类cna_bsc的公共部分.

好阅读:

What’s the meaning of,Warning: Derived::f(char) hides Base::f(double)?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读