基类类型的引用或指针既可以引用基类对象,也可以引用派生类对象,但编译器只把它当做基类类型对象。
#include <iostream> using namespace std; class base { public: base():cat(0){} void print() { cout << "cat" << cat << endl; } private: int cat; }; class derive:public base { public: derive():base(),dog(1){} //这里base()可以不用写,默认调用无参构造函数 void print() { cout<< "dog" << dog << endl; } private: int dog; }; int main() { base A; base *p; derive B; p = &A; p->print(); p = &B; p->print(); return 0; }
会输出cat0 cat0
可以看出两个都调用了基类对象的print 函数。
但是派生类的引用转换不同于转换对象
。将派生类对象传给基类的引用,引用直接绑定该对象对象本身未被复制。
将派生类对象传给希望接受基类类型的对象(非引用),则派生类对象的基类部分被复制到基类形参
#include <iostream> using namespace std; class base { public: base():cat(0){} void print() { cout << "base" << cat << endl; } protected: int cat; }; class derive:public base { public: derive() { cat = 1; } void print() { cout<< "derive" << cat << endl; } }; int main() { derive B; base A(B); base C = B; A.print(); C.print(); return 0; }
代码执行结果为base1 base1
很明显执行的是基类的print函数,但是也执行派生类的构造函数并把cat参数的值传给了基类.
via:
http://blog.csdn.net/z0203153008/article/details/4619279