item12 使用override声明重写函数

// 1 虚函数重写机制,使我们可以通过基类的接口调用派生类的成员函数
class Base {
public:
    virtual void doWork();  // 基类虚函数
};
class Derived: public Base {
public:
    virtual void doWork();  // 重写虚函数
};
std::unique_ptr<Base> upb = std::make_unique<Derived>();
upb->doWork();  // 多态,调用派生类虚函数

// 2 引用限定符 限定成员函数只能用于左值和右值
class Widget {
public:
    void doWork() &;
    void doWork() &&;
};
Widget makeWidget(); // 右值
Widget w;  // 左值
w.doWork(); // Widget::doWork &
makeWidget().doWork();  // Widget::doWork &&

// 3 如果基类的虚函数有引用限定符,派生类的重写函数必须有相同的引用限定符,不然不会重写父类函数
// 以下例子完全合法,但是没有任何虚函数重写
class Base {
public:
    virtual void mf1() const;
    virtual void mf2(int x);
    virtual void mf3() &;
    void mf4() const;
};
class Derived: public Base {
public:
    virtual void mf1();
    virtual void mf2(unsigned int x);
    virtual void mf3() &&;
    void mf4() const;
};
// 虽然没有任何warning,但是不符合本人需求
// mf1 在Base基类声明为const,但是Derived派生类没有常量限定符
// mf2 在Base基类声明接收int参数,但是Derived接收 unsigned int
// mf3 在Base基类声明为左值引用限定,但是Derived为右值引用限定
// mf4 在Base基类没有声明virtual 虚函数
// 加上override之后可以强制需求基类对父类重写,以下代码编译器会报错
class Derived: public Base {
public: 
    virtual void mf1() override;
    virtual void mf2(unsigned int x) override;
    virtual void mf3() && override;
    virtual void mf4() const override;
};
// 比起让编译器告诉你想重写而实际没有重写,不如给派生类重写函数全部加上override
// C++引入两个上下文关键字,override和final
// final可以防止派生类重写,final也能用于类,表示这个类不能用作基类

// 4 成员函数限定可以很容易的区分一个成员函数被哪个对象(即*this)调用。它和在成员函数声明尾部添加一个const相似,暗示调用这个成员函数的对象(即*this)是const的
class Widget {
public:
    using DataType = std::vector<double>;
    DataType& data() & {return values;} 对于左值Widget 返回左值
    DataType data() && {return std::move(values);}  // 对于右值Widget 返回右值
private:
    DataType values;
};
Widget makeWidget();
Widget w;
auto vals1 = w.data(); // 调用左值重载版本的Widget::data, 拷贝构造vals1
auto vals2 = makeWidget().data();  // 调用右值重载版本的Widget::data 移动构造vals2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值