码迷,mamicode.com
首页 > 编程语言 > 详细

effective C++ 读书笔记 条款36-37

时间:2014-12-04 18:10:18      阅读:277      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   color   os   使用   sp   on   

条款36:绝不重新定义继承而来的non-virtual函数

重要点:non-virtual函数都是静态绑定

// 1241.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;


class Base
{
public:
	void func()
	{
		cout<<"Base::func()"<<endl;
	}
};

class Derived : public Base
{
public:
	void func()
	{
		cout<<"Derived::func()"<<endl;
	}
};
int _tmain(int argc, _TCHAR* argv[])
{

	Derived test;
	Base* pB = &test;

	Derived* pD = &test;

	pB->func();//调用Base::func()
	pD->func();//调用Derived::func()
	/*
	这里我们讨论的不是关于隐藏的问题;上面pB指向一个子类,但是调用的是父类的func()函数,至于为什么,因为不是虚函数,没有virtual;
	要明白一点:non-virtual函数 Base::func and Derived::func都是静态绑定的,pB被声明为一个人 pointer-to-Base,通过pB调用的non-virtual
	函数永远是Base所定义的版本,即使pB指向一个类型为它的派生类的对象。
	pD 调用的是Derived的函数版本,这里也可以说成是隐藏,但是最终原因是因为 静态绑定。
	一般  Derived dTest,dTest.func()这样调用我们一般说是因为隐藏。对于对象,而我们本例子当中对应的是指针或者引用,是因为静态绑定!
	
	*/

	getchar();
	return 0;
}


总上:任何情况下都不应该重新定义一个继承而来的non-virtual函数;

对于一个基类来说,如果一个函数定义为非虚函数,那么意味着这个函数并不想改变,所以子类不应该继承它,一个类当中的非虚函数,不变性凌驾于其特异性上。

 

条款37:绝不重新定义继承而来的缺省参数值:

virtual函数是动态绑定,缺省参数值是静态绑定;

 

// 1240.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

class  Shape
{
public:
	enum ShapeColor{Red,Green,Blue};
	virtual void draw(ShapeColor color = Red) const = 0;

};

class Rectangle:public Shape
{
public:
	virtual void draw(ShapeColor color = Green) const
	{
		cout<<"Rectangle"<<endl;
	}
};

class Circle : public Shape
{
public:
	virtual void draw(ShapeColor color) const
	{
		cout<<"Circle"<<endl;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{

	Shape* ps;
	Shape* pc = new Circle;
	Shape* pr = new Rectangle;

	pr->draw();//这里调用的是Rectangle的draw函数,但是函数参数color却是Shape父类里面的参数
	/*
	virtual函数是动态绑定,而缺省参数值却是静态绑定。
	这就出现了上面的 调用一个定义于子类的virtual函数,同时却使用base class为它所指定的缺省参数值。
	pr的动态类型是Rectangle*,所以调用的是Ractangle的virtual函数,但是由于pr的静态类型是Shape*,所以此
	函数调用的缺省参数值却是来自鱼Shape Class.
	*/
	getchar();
	return 0;
}


总结:不要重新定义一个继承而来的缺省参数值,因为缺省参数值是静态绑定的,而virtual函数--你唯一应该覆写的东西--却是动态绑定!!

 

effective C++ 读书笔记 条款36-37

标签:style   blog   io   ar   color   os   使用   sp   on   

原文地址:http://blog.csdn.net/djb100316878/article/details/41723775

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!