引子: 阿里的一道题: #include <IOSTREAM> using namespace std; class A{ public: ) { cout<<"a~"<<val<<endl; } virtual void test() { func(); } }; class B: public A{ public: ) { cout<<"b~"<<val<<endl; } };…
绝不重新定义继承而来的缺省参数值 静态类型 动态类型…
绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定,而virtual函数-----你唯一应该覆写的东西-----却是动态绑定.…
NOTE: 1.绝不重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定的,而virtual 函数-----你唯一应该覆盖的东西----却是动态绑定的.…
先看下面的例子: enum MyColor { RED, GREEN, BLUE, }; class Shape { public: ; }; class Rectangle: public Shape { public: void Draw(MyColor color = GREEN) const { cout << "default color = " << color << endl; } }; class Triangle : public…
在了解静态绑定和动态绑定之前,先了解什么是对象的静态类型,什么是对象的动态类型. 对象的静态类型:对象在声明时采用的类型.是在编译器决定的. 对象的动态类型:目前所指对象的类型.是在运行期决定的. 动态类型可以更改,而静态类型不可更改.看一个示例 class Base { public: void setData(int i=10) { cout <<" virtual int Base::setData()"<<endl; } virtual int getD…
(1)当派生类中重写了基类的非虚函数时,这个时候这个函数发生的是静态绑定 下面中的代码中: 定义一个基类B,基类定义了函数fcm,fcm是非虚的函数. 定义一个派生类D,派生类重新定义了fcm. 当用基类的指针指向派生类对象,调用fcm时,调用的是基类的函数. #include<iostream> using namespace std; class B { public: void fcm() { cout<<"B::fcm"<<endl; } }…
看下面的两个类的声明代码: class B { public: void mf(); //something to do }; class D : public B { public: void mf(); }; 如果有下面的调用: D x; //第一种调用 B *pB = &x; pB->mf();//调用B::mf //第二种调用 D *pD = &x; pD->mf();//调用D::mf 这两种调用的行为是不一样的,虽然从表面上看,两者都是通过对象x调用成员函数mf,凭…
1.绝不重新定义继承而来的non-virtual方法,为什么? 首先想想,non-virtual方法是干什么的?也就是说,它的使用场景.父类的non-virtual方法,其实就是告诉子类,继承实现,子类决定是否继承接口(也就是子类决定是否继续提供接口).如果重新定义了non-virtual方法,就不符合它的使用场景. 2.如果想重新定义继承而来的方法,应该把父类方法修改为virtual方法,因为virtual方法的使用场景是:父类告诉子类,继承接口,修改实现. 3.如果重新定义了继承而来的non…
切勿重新定义继承来的带缺省参数的函数.我们知道,继承来的函数是virtual 的,至于原因在上一节中已经说明了,即“切勿重新定义父类non-virtual函数”.所以确切的描述应该是“切勿重新定义继承来的带缺省参数的virtual函数”.因为缺省参数是静态绑定,而virtual是动态绑定. typedef enum _ColorEnum{ eRed = , eYellow, eBlack }ColorEnum; class BaseOption { public: BaseOption(void…