重载子类中的虚函数

Vij*_*jay 13 c++ virtual inheritance

我只是在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;
}
Run Code Online (Sandbox Code Playgroud)

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

我收到编译错误如下:

"temp10.cc",第45行:错误:调用"cna_MO :: print()"时参数太多.

Alo*_*ave 25

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

将函数添加cna_bsc::print(int a)到派生类cna_MO::::print()后,Derived类的用户将无法再看到该函数.这称为函数隐藏.

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

using cna_MO::print;
Run Code Online (Sandbox Code Playgroud)

public派生类的部分中cna_bsc.

好读:

是什么意思,警告:Derived :: f(char)隐藏Base :: f(double)?

  • 当你调用`_mo-> print(5)时,错误在`cna_MO :: print()`中;`注意`_mo`的类型是`cna_MO*`而``cna_MO`类没有`print()`采用单个参数并因此产生错误的函数.你混淆的原因是混淆不同的不同类名,**不要使用像这样的命名公约** (4认同)