我只是在用 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_bsc
的 public
部分。
好读:
What's the meaning of, Warning: Derived::f(char) hides Base::f(double)?
关于c++ - 在子类中重载虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8816794/