基类类型的引用或指针既可以引用基类对象,也可以引用派生类对象,但编译器只把它当做基类类型对象。
#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
来源:https://www.cnblogs.com/youxin/archive/2012/06/27/2566352.html