effective c++条款总结(4)

  1. 不要重新定义继承而来的非virtual函数。
  2. 不要重新定义继承而来的缺省参数值。
// 让非virtual函数指定缺省参数,而private virtual函数负责工作。
class Base{
public:
	enum BaseType{ A, B, C};
	void show(BaseType type = A) const{
		doShow(type);
	}
private:
	virtual void doShow(BaseType type) const = 0;
}

class Derived : public Base{
public:
	...
private:
	virtual void doShow(BaseType type) const;
}
  1. 当认为private继承是表现两个类之间的关系时,才使用它。
class Empty{};
class anInt{
private:
	int x;
	Empty e;
};
// c++会默认安插一个char到空对象中
sizeof(anInt) > sizeof(int); // return true

class anIntDerived : private Empty{
private:
	int x;
}
//空白基类最优化,一般在单一继承下可行
sizeof(anInt) == sizeof(int); // return true
  1. 谨慎使用多重继承
class A{
public:
	void show();
};
class B{
private:
	void show();
};
class C: public A, public B{
	...
};
C c;
c,show(); // 歧义,编译器不知道调用哪个show()
c.A::show(); // 正确
c.B::show(); // 错误,无法调用private

同时我们还要注意菱形多重继承。

class A{...};
class B : virtual public A{...};
class C : virtual public A{...};
class D : public B, public C{...};
  1. 注意名称可视性,基类的名称覆盖问题。
class B{
private:
	int x;
public:
	virtual void mf1() = 0;
	virtual void mf1(int);
	virtual void mf2();
	void mf3();
	void mf3(double);
};

// case 1
class D : public B{
public:
	virtual void mf1();
	void mf3();
}
// 注意,只要同名就会被掩盖
D d;
int x;
d.mf1();
d.mf1(x);// 错误。D::mf1掩盖了B::mf1
d.mf2();
d.mf3();
d.mf3(x);// 错误。D::mf3掩盖了B::mf3

// case 2
class D : public B{
public:
	using B::mf1;
	using B::mf3;
	virtual void mf1();
	void mf3();
}
// 这时候就会正常调用
D d;
int x;
d.mf1(); // D::mf1
d.mf1(x);// B::mf1
d.mf2();// B::mf2
d.mf3();// D::mf3
d.mf3(x);// B::mf3

// case 3
class D : public B{
public:
	virtual void mf1() { B::mf1(); }
}
// 利用隐式inline
D d;
int x;
d.mf1(); // D::mf1
d.mf1(x);// 错误,B::mf1()被掩盖
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值