C++中继承情况下的名称问题

来源:互联网 发布:惠安县招聘网络销售 编辑:程序博客网 时间:2024/06/05 04:14

如果基类中virtual函数的声明和子类中的生命不一致会怎么样?

没关系,相当于子类声明了新的virtual函数。

不过derived class内的名称会掩盖base class内的名称。


看下面来自《effective c++》 的例子:

class Base {
private:
    int x;
public:
    virtual void mf1()
    {
        cout << "Base::mf1()" << endl;
    }
    virtual void mf1(int k)
    {
        cout << "Base::mf1(int)" << endl;
    }
    void mf3()
    {
        cout << "Base::mf3()" << endl;
    }
    void mf3(double)
    {
        cout << "Base::mf3(double)" << endl;
    }
};

class Derived : public Base {
public:
    virtual void mf1()
    {
        cout << "Derived::mf1()" << endl;
    }
    virtual void mf1(int k, int j)
    {
        cout << "Derived::mf1(int, int)" << endl;
    }
    void mf3()
    {
        cout << "Derived::mf3()" << endl;
    }

};


int main()
{
    Derived d;
    d.mf1();
    d.mf1(1, 1);
//    d.mf1(1);
    d.mf3();
//    d.mf3(0.0);
}

注释掉的语句如果不被注释,将会出现编译错误。Derived中声明了mf1,导致base中的mf1(int)在Derived中是不可见的了,mf3同理。

如果想使用Base中的mf1和mf3,可以使用using声明式。

即将Derived修改为:

class Derived : public Base {
public:
    using Base::mf1;
    using Base::mf3;
    virtual void mf1()
    {
        cout << "Derived::mf1()" << endl;
    }
    virtual void mf1(int k, int j)
    {
        cout << "Derived::mf1(int, int)" << endl;
    }
    void mf3()
    {
        cout << "Derived::mf3()" << endl;
    }
};

这样main函数中的5条语句都能运行,运行结果为:

Derived::mf1()
Derived::mf1(int, int)
Base::mf1(int)
Derived::mf3()
Base::mf3(double)

更多请参考:

《Effective C++》Item 33, 36, 37


原创粉丝点击