C++ Effictive 第6章 继承与面向对象设计 笔记

继承意味着"is-a"。如果B继承自A,那么B is-a A。

子类声明与父类函数同名的函数时,父类函数会被遮掩。

使用using Base::func(args...);父类所有func的重载函数都在子类中被声明。此举下,如果子类函数与父类函数参数也一致,父类函数仍然被遮掩。

pure virtual func() 父类不用提供实现,为了让子类只继承接口。

但可以提供实现作为默认行为,子类用Base::func()才能得到此实现。

virtual func() 父类可以提供实现,为了让子类继承接口和实现。

“如果成员函数是个non-virtual函数,意味着它不打算在子类中有不同的行为”

“non-virtual代表着不变性和凌驾特异性”

由Non-Virtual Interface实现Template Method模式

class A {
public:
    virtual void func();
};

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

class A {
public:
    void func() {
        // doSomeThing;
        doFunc();
        // doSomeThing;
    };
private:
    virtual void doFunc();
};

doSomeThing可以是操作互斥锁,验证约束条件等。

func是doFunc的wrapper

strategy设计模式

 

 默认参数是静态绑定的,函数指针是动态绑定的。

因此用基类指针声明一个继承类对象,并且基类声明了一个带默认参数的纯虚函数,并且继承类重声明了此函数无默认参数版本时,调用函数会调用继承类函数,并用基类给定的的默认参数。

复合意味着has-a(有一个)或者is-inplemented-in-terms-of (根据某物实现出)

编译器不会自动的将一个私有继承的子类转换为父类,公有继承会。 

private继承意味着只有实现部分应该被继承,接口部分应该略去。

private也意味着in-implemented-terms-of,与复合相比,尽量使用复合,必要时采用private继承。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值