c++ - 在子类中重载虚函数

标签 c++ inheritance virtual

我只是在用 C++ 中的 virtual 关键字和继承概念进行测试。 我写了一个小程序:

#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()".

最佳答案

一旦在派生类中重载基类中的函数,基类中具有相同名称的所有函数都将隐藏在派生类中。

将函数 cna_bsc::print(int a) 添加到派生类后,函数 cna_MO:::::print() 将不再对用户可见派生类的。这称为函数隐藏。

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

using cna_MO::print;

在派生类 cna_bscpublic 部分。

好读:

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

关于c++ - 在子类中重载虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8816794/

相关文章:

c++ - 具有无限子节点的树的递归函数。 C++

javascript - native Javascript 类实现

C# 继承和方法

operating-system - Linux 中的虚拟软盘驱动器

c++ - 这个简单的代码会导致内存泄漏吗?

c++ - 如何防止派生类公开私有(private)/ protected 虚函数?

c++ - 如何为不同的分支使用不同的 Xcode 版本(或具有不同 Clang 版本的最新 Xcode)?

c++ - 在 NDK 的稳定 API 之外使用原生 Android 系统库

python - Python中的继承和init方法

c++ - 为什么这个混合继承程序会给出错误的输出?