我在visual studio 2012中编写了以下C ++程序。
它输出如下
in base::fun
in child::fun
in child::fun(int)
in child::fun(int)
in child2::fun
虽然我期待跟随
in base::fun
in child::fun
in child::fun(int)
in child2::fun(int)
in child2::fun
代码:
#include<iostream>
using namespace std;
class base
{
public:
virtual void fun()
{
cout<<"in base::fun\n";
}
};
class child:public base
{
public:
void fun()
{
cout<<"in child::fun\n";
}
virtual void fun(int i)
{
cout<<"in child::fun(int)\n";
}
};
class child2:public child
{
void fun()
{
cout<<"in child2::fun\n";
}
void fun(int i)
{
cout<<"in child2::fun(int)\n";
}
};
int main()
{
base *ptr;
ptr = new base();
ptr->fun();
delete ptr;
ptr = new child();
ptr->fun();
child Cobj;
Cobj.fun(10);
child *Cptr;
Cptr = new child2();
Cptr->fun(10);
Cptr->fun();
int str;
cin>>str;
}
现在我所做的只是尝试重载子类中的重写方法。
我怀疑为什么我不能重载子类中的fun方法????
答案 0 :(得分:0)
鉴于base::fun()
和base::fun(int)
的行为不一致,它必须是编译器的错误。
至于正确的输出,您的期望是正确的!从标准,第10.3.2节:
如果在类
vf
和类中声明了虚拟成员函数Base
类Derived
,直接或间接来自Base
成员 函数vf
具有与Base::vf
相同的名称和相同的参数列表 声明,然后Derived::vf
也是虚拟的(无论是否是 如此声明)并覆盖Base::vf
。
那里没有提到访问规范。
注意:您应该在基类中添加一个虚拟析构函数,否则在向派生类添加成员时会出现问题。
答案 1 :(得分:-1)
编辑: 好的,我会说它有点不同。
class base
{
public:
virtual void fun ( )
{
std::cout << "base::fun()";
}
};
class child
{
private:
void fun ( )
{
std::cout << "child::fun()";
}
};
child* ch = new child();
ch->fun();
如果您有这样的代码,您将收到编译器错误“Child :: fun()无法访问” 但如果你改变最后两行:
base* ch = new child();
ch->fun();
编译器将解决您的乐趣,因为公共基本功能和功能隐藏不会出现。
抱歉,您可以重写公共功能是私有的,但绝不应该这样做。 http://www.parashift.com/c++-faq-lite/hiding-inherited-public.html
我错了:“你的基类和子类有public void fun(int)
,而你的child2有私有(因为它之前没有任何标识符:public,private,protected)。所以private child2::fun()
是来自public child2::fun
的不同,在您的班级中未被覆盖。“