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

前端之家收集整理的这篇文章主要介绍了c – 在子类中重载虚拟函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我只是用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)?

原文链接:https://www.f2er.com/c/115513.html

猜你在找的C&C++相关文章