将父类成员函数提升到子类
分类:技术
今天在看 C++11 的 Inherited Constructors 特性时发现了一个以前不知道的传统 C++ 奇技淫巧。
class Base {
public:
void foo(float a);
};
class Derived: public Base {
public:
void foo(int a);
};
这样的代码,显然 Derived::foo()
会把 Base::foo()
覆盖。
今天得知,using
居然还可以把父类的成员「提升」到子类中:
class Derived: public Base {
public:
using Base::foo; // 看这里看这里看这里
void foo(int a);
};
如此,就相当于在 Derived
中添加了一个和 Base::foo()
一模一样的成员。(当然,从字面上也是很顾名思义的嘛。)
Derived d;
d.foo(3.14f); // 这样调用的就是 Derived::foo(float a) 了
之前我曾想,两个完全符合「is-a」关系的类,做成聚合显然是不甘心的。但如果父类接口有 N 个,子类只是想添加 1 个接口,然后将父类中的 M 个(M < N)接口暴露出来该怎么办?想想 private
继承,然后自己在子类中写 M 个 wrapper 似乎是个可行的方法,但如果 M 很大似乎依旧不甘心。现在知道了这个技巧似乎好解决了很多呢。(不过,整个类的声明也会随之变得脑残起来。)
顺带一提,传统 C++ 中的这个方法是无法提升构造函数的,而 C++11 中则加入了允许继承(提升)构造函数的特性(当然,目前貌似还没有编译器支持 = =)。
以上。
恭喜你又解决了一个其它语言中不存在的问题 :-3
我觉得这是 C++ 各种稀奇古怪没见过的语法里相对正常的一个了 =。=