看下下面程序的输出.请解释下~~

来源:百度知道 编辑:UC知道 时间:2024/06/02 10:58:23
请写出程序运行的结果

#include<iostream>
using namespace std;

class base{
public:
virtual void print() const {cout<<"base::f()"<<endl;}
};

class derived:public base {
public:
virtual void print() const {cout<<"derived::f()"<<endl;}
};

void print(const base& obj)
{
obj.print();
}

int main()
{
base* pb1=new derived();
print(*pb1);

base* pb2=new base(*pb1);
print(*pb2);

base b=base(derived());
print(b);

delete pb1;
delete pb2;

return 0;
}

base* pb1=new derived(); //无论基类还是派生类都没有构造函数,但是系统分配了一个构造函数,只是这个构造函数什么都不做,这里的顺序是先调用基类的构造函数,然后是derived的构造函数,但是两个构造函数都是缺省的即什么都不做
print(*pb1); //这里根据动态编联可知道是调用了派生类的print,所以virtual void print() const {cout<<"derived::f()"<<endl;} ,动态编联不懂得话就网上查一下,我就不讲了
base* pb2=new base(*pb1);
print(*pb2); //同上,这个例子很好,居然是两个虚函数,开始还以为错了,查了一下才知道是自己孤陋寡闻了
base b=base(derived()); //base是没有定义构造函数的,所以base(derived())实际上是一个一个什么都不做的构造函数,函数的初始有多种一种是new ,一种是调用构造函数,这里就是条用构造函数,但是由于本身没有构造函数,所以是有系统默认给的。你写base b=base(121),这()里面写什么都可以的,你写字符楔形base b=base(“love”);
print(b); //b是个base类,普通的哦,所以...

这个不是把派生类转化为基类吧,而是调用了基类的默认拷贝构造函数
(base)derived()//这个是转化吧

base(derived())//这个是调用的构造函数

能运行,测试过了,但对默认的拷贝构造函数不是很懂,期待高手解答

输出:
derived::f()
base::f()
base::f()

base* pb1=new derived();
print(*pb1); 定义一个指向base的指针,但是把derived的地址赋值给它,所以print()调用的是derived的print()

base* pb2=new base(*pb1);
print(*pb2); 定义一