基类类型的引用或指针既可以引用基类对象,也可以引用派生类对象但编译器只把它当做基类类型对象

#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