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

Effective C++ Item 33 Avoid hiding inherited names

2014-03-01 12:44 495 查看
class Base {
private:
int x;
public:
virtual void mf1() = 0;
virtual void mf2();
void mf3();
...
};

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


上面代码构成了一个 namespace



在 derived class 内的 mf4 代码实现为

void Derived::mf4() {
...
mf2();
...
}


编译器看到 mf2 后现在 mf4 的作用空间查找, 然后到 Derived 的作用空间查找, 最后在 Base 中找到.

2. 我们再考虑前一个例子, 这次让我们重载 mf1 和 mf3

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();
...
};


从名称查找观点来看, Base::mf1 Base::mf3 不再被 Derived 继承, 因为 Base class 内的函数被遮蔽了

Derived d;
int x;
..
d.mf1();
d.mf1(x);    // 错误! Derived::mf1 遮蔽了 Base::mf1
d.mf2();
d.mf3();
d.mf3(x); // 错误! Derived::mf3 遮蔽了 Base::mf3


为了达成本来需要的目的, 我们只需在 Derived class 内添加两行代码

using Base::mf1;
using Base::mf3;


现在, 上面发生错误的代码都不会报错了, 一切按照既定的轨道在前进!

3. 但有时候, 你并不像继承 Base class 的所有函数, 这时可以理解的. 这在 public inheritance 中不可发生(见 item 32) 但 private inheritance 却是有可能的, 那么部分继承的一个很好的解决方案是 转交函数

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