TimothyQiu's Blog

keep it simple stupid

将父类成员函数提升到子类

分类:技术

今天在看 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 中则加入了允许继承(提升)构造函数的特性(当然,目前貌似还没有编译器支持 = =)。

以上。

C++C++11

已有 2 条评论 »

  1. 恭喜你又解决了一个其它语言中不存在的问题 :-3

    1. 我觉得这是 C++ 各种稀奇古怪没见过的语法里相对正常的一个了 =。=

添加新评论 »