C++对象切片

// test.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include 
#include 
#include   
#include   


using namespace std;  
class Pet {  
	string pname;  
public: 
	Pet(Pet& p)
	{
		pname=p.pname;
	}


	Pet(const string& name) : pname(name) {}  
	virtual string name() const { return pname; }  
	virtual string description() const {  
		return "This is " + pname;  
	}  
};  
class Dog : public Pet {  
	string favoriteActivity;  
public:  
	Dog(const string& name, const string& activity)  
		: Pet(name), favoriteActivity(activity) {}  
	string description() const {  
		return Pet::name() + " likes to " +  
			favoriteActivity;  
	}


	operator Pet()
	{
		return *this;
	}
};  
void describe(Pet p) { // Slices the object  
	cout << p.description() << endl;  
}  
int main() {  
	Pet p("Alfred");  
	Dog d("Fluffy", "sleep");  
	describe(p);    //正常调用基类函数  
	describe(Pet(d));    //对象切片  
	describe(d);    //对象切片  
	getchar();
}   

输出结果:

This is Alfred
This is Fluffy
This is Fluffy

在该程序中有一个重载运算符:

operator Pet()

还有一个Pet的拷贝构造函数。

在执行describe(Pet(d))和describe(d)时都是执行的Pet的拷贝构造函数。

operator Pet()似乎只是对那些非继承的类有效。

你可能感兴趣的:(C/C++)