c++遮掩由继承带来的名称

在c++中,类与类之间有某些语义关系,这种关系是演化的结果,某些类的成员函数勇用于改善其特性,或者特化已有基类的某些特性,而对其余的特性加以继承。继承可以使基类的某些特性充分的得到可重用。但在某些时候处理不好的话,会带来一些编译错误。如下面的代码:

#include<iostream>

using namespace std;

class Base {
    public:
        virtual void fucA(void) = 0;
        virtual void fucA(int );
        void fucB();
        void fucC();
        void fucC(double);
};

void Base::fucA(int x) {
    cout << "Call function base A(int)" << endl;
}

void Base:: fucB() {
    cout << "Call function base B" << endl;
}

void Base::fucC() {
    cout << "Call function base C" << endl;
}

void Base::fucC(double x) {
    cout << "Call function base C(int)" << endl;
}

class Derive : public Base{
    public:
        virtual void fucA(void);
        void fucB();
        void fucC();
};

void Derive::fucA(void) {
    cout << "Call function derive A" << endl;
}

void Derive::fucB() {
    cout << "Call function derive B" << endl;
}

void Derive::fucC() {
    cout << "Call function derive C" << endl;
}

int main(void)
{
    Derive derive;
    int x = 7;

    derive.fucB();
    derive.fucA();
    derive.fucA(x);//错误!Derive::fucA遮掩了Base::fucA
    derive.fucC();
    derive.fucC(9.0);//错误!Derive::fucA遮掩了Base::fucA

    return 0;
}

用gcc –c hhy.cc编译会产生如下错误:

微博桌面截图_20130517201222

Base class内作为名为fucA和fucC的函数都被derive class 内的fucA和fucC函数遮掩掉了。Base::fucA和Base::fucC不再被类Derive继承.这些行为背后的基本理由是为了防止你在程序库或应用框架内建立新的derived class时附带的从疏远的base class继承重载函数。如果你想使用base的函数可以通过using Base来实现:

#include<iostream>

using namespace std;

class Base {
    public:
        virtual void fucA(void) = 0;
        virtual void fucA(int );
        void fucB();
        void fucC();
        void fucC(double);
};

void Base::fucA(int x) {
    cout << "Call function base A(int)" << endl;
}

void Base:: fucB() {
    cout << "Call function base B" << endl;
}

void Base::fucC() {
    cout << "Call function base C" << endl;
}

void Base::fucC(double x) {
    cout << "Call function base C(int)" << endl;
}

class Derive : public Base{
    public:
        using Base::fucA;
        using Base::fucC;
        virtual void fucA(void);
        void fucB();
        void fucC();
};

void Derive::fucA(void) {
    cout << "Call function derive A" << endl;
}

void Derive::fucB() {
    cout << "Call function derive B" << endl;
}

void Derive::fucC() {
    cout << "Call function derive C" << endl;
}

int main(void)
{
    Derive derive;
    int x = 7;

    derive.fucB();
    derive.fucA();
    derive.fucA(x);
    derive.fucC();
    derive.fucC(9.0);

    return 0;
}

这样就ok了。

现在越来越发现c++的强大了,对c++也是越来越感兴趣了。good good study, day day up!!!
原文链接: https://www.cnblogs.com/lutianba/archive/2013/05/17/3084313.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/88870

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午11:50
下一篇 2023年2月9日 下午11:50

相关推荐