您的位置:首页 > 编程语言 > C语言/C++

C++的继承与名字覆盖

2010-06-20 15:40 232 查看
先看个例子。

class Base{
private:
int x;
public:
virtual void mf1() = 0;
virtual void mf1(int);
virtual void mf2();
void mf3();
void mf3(double);
...
};

class Derived: public Base{
public:
virtual void mf1();
void mf3();
void mf4();
...
};


然后执行如下调用:

Derived d;
int x;
...
d.mf1();//Derived::mf1()
d.mf1(x);//wrong
d.mf2();//Base::mf2
d.mf3();//Derived::mf3
d.mf3(x);//wrong


为什么会出错呢?子类不是可以访问父类的成员吗?看看下面这个也许就明白了。

int x;
void f()
{
double x;
std::cin >> x;
}


虽然类型不一样,但在f函数内部使用的是函数内部作用域的变量x。类也是一个作用域,父类的作用域包括子类的作用域。因此,子类的同名函数、变量将会覆盖父类的函数、变量,不管是否virtual,是否重载了,也是一样。这是C++想减少我们犯错误的机会。

但是我们要是我们非得去使用怎么办?using。

class Base{
private:
int x;
public:
virtual void mf1() = 0;
virtual void mf1(int);
virtual void mf2();
void mf3();
void mf3(double);
...
};

class Derived: public Base{
public:
using Base::mf1;
using Base::mf3;
virtual void mf1();
void mf3();
void mf4();
...
};


这样子让父类名为mf1和mf3的所有东西在子类的作用域可见了。当然子类的覆盖效果还是存在。

Derived d;
int x;
...
d.mf1();//Derived::mf1()
d.mf1(x);//Base::mf1
d.mf2();//Base::mf2
d.mf3();//Derived::mf3
d.mf3(x);//Base::mf3


如果不想将父类的所有同名函数都暴露给子类,可以在子类中声明函数调用的方法来获取。

class Derived:private Base{
...
virtual void mf1(){
Base::mf1();
}
...
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: