我们可以重载在子类中重写的方法

时间:2014-08-11 10:19:46

标签: c++ visual-studio-2012

我在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方法????

2 个答案:

答案 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不同,在您的班级中未被覆盖。“