c++ 30 继承2



#include <iostream>
using namespace std;
class Base
{
public:
	Base()
	{
	   cout<<"Base..."<<endl;
	}
	~Base()
	{
	   cout<<"~Base..."<<endl;
	}

	int b_;
};
class Derived:public Base
{
public:
	Derived()
	{
		cout<<"Derived..."<<endl;
	}
	~Derived()
	{
	cout<<"~Derived..."<<endl;
	}

	int d_;
};
int main(void)
{
	Derived d;
	cout<<d.b_<<"  "<<d.d_<<endl;

  return 0;
}
下面是打印结构,要构造一个派生类,首先要构造基类部分,再构造派生类部分,

代码优化:

#include <iostream>
using namespace std;
class Base
{
public:
	Base(int b):b_(b)
	{
	   cout<<"Base..."<<endl;
	}
	~Base()
	{
	   cout<<"~Base..."<<endl;
	}

	int b_;
};
class Derived:public Base
{
public:
	Derived(int d):d_(d),Base(10)//派生类在构造基类的时候 ,给基类传参
	{
		
		cout<<"Derived..."<<endl;
	}
	~Derived()
	{
	cout<<"~Derived..."<<endl;
	}

	int d_;
};
int main(void)
{
	Derived d(100);
	cout<<d.b_<<"  "<<d.d_<<endl;

  return 0;
}
#include <iostream>
using namespace std;
class Base
{
public:
	Base(int b):b_(b)
	{
	   cout<<"Base..."<<endl;
	}
	~Base()
	{
	   cout<<"~Base..."<<endl;
	}

	int b_;
};
class Derived:public Base
{
public:
	Derived(int b,int d):d_(d),Base(b)//派生类在构造基类的时候 ,给基类传参
	{
		
		cout<<"Derived..."<<endl;
	}
	~Derived()
	{
	cout<<"~Derived..."<<endl;
	}

	int d_;
};
int main(void)
{
	Derived d(100,200);
	cout<<d.b_<<"  "<<d.d_<<endl;

  return 0;
}

派生类当中包含另一个对象,又该如何?

#include <iostream>
using namespace std;
class Base
{
public:
	Base(int b):b_(b)
	{
	   cout<<"Base..."<<endl;
	}
	~Base()
	{
	   cout<<"~Base..."<<endl;
	}

	int b_;
};
class ObjectD
{
public:
	ObjectD()
	{
	   cout<<"ObjectD.."<<endl;
	}
	~ObjectD()
	{
		cout<<"~ObjectD.."<<endl;
	}
};
class Derived:public Base
{
public:
	Derived(int b,int d):d_(d),Base(b)//派生类在构造基类的时候 ,给基类传参
	{
		
		cout<<"Derived..."<<endl;
	}
	~Derived()
	{
	cout<<"~Derived..."<<endl;
	}

	int d_;
	ObjectD objd_;
};
int main(void)
{
	Derived d(100,200);
	cout<<d.b_<<"  "<<d.d_<<endl;

  return 0;
}



先调用的是基类的构造函数,然后调用对象成员的构造函数,然后调用派生类的构造函数.


#include <iostream>
using namespace std;
class Base
{
public:
	Base(int b):b_(b)
	{
	   cout<<"Base..."<<endl;
	}
	~Base()
	{
	   cout<<"~Base..."<<endl;
	}

	int b_;
};
class ObjectD
{
public:
	ObjectD(int objd):objd_(objd)
	{
	   cout<<"ObjectD.."<<endl;
	}
	~ObjectD()
	{
		cout<<"~ObjectD.."<<endl;
	}
	int objd_;
};
class Derived:public Base
{
public:
	Derived(int b,int d):d_(d),Base(b),objd_(111)//派生类在构造基类的时候 ,给基类传参
	{
		
		cout<<"Derived..."<<endl;
	}
	~Derived()
	{
	cout<<"~Derived..."<<endl;
	}

	int d_;
	ObjectD objd_;//ObjectD 没有默认的构造函数,也需要在初始化列表中构造
};
int main(void)
{
	Derived d(100,200);
	cout<<d.b_<<"  "<<d.d_<<endl;

  return 0;
}
//4 中情况下,在初始化列表中调用
//const 成员
//引用成员
//类的对象成员没有默认构造函数的时候,只能够在类的构造函数初始化列表中中调用该对象的构造函数进行初始化
//基类没有默认构造函数的时候,基类的构造函数要在派生类构造函数初始化列表中调用
拷贝构造函数

#include <iostream>
using namespace std;
class Base
{
public:
	Base(int b):b_(b)
	{
	   cout<<"Base..."<<endl;
	}
	~Base()
	{
	   cout<<"~Base..."<<endl;
	}
	Base(const Base& other)
	{
	
	}
	int b_;

};
class ObjectD
{
public:
	ObjectD(int objd):objd_(objd)
	{
	   cout<<"ObjectD.."<<endl;
	}
	~ObjectD()
	{
		cout<<"~ObjectD.."<<endl;
	}
	int objd_;

};
class Derived:public Base
{
public:
	Derived(int b,int d):d_(d),Base(b),objd_(111)//派生类在构造基类的时候 ,给基类传参
	{
		
		cout<<"Derived..."<<endl;
	}
	~Derived()
	{
	cout<<"~Derived..."<<endl;
	}
	Derived(const Derived& other):d_(other.d_),objd_(other.objd_),Base(other)
	{
	
	}

	int d_;
	ObjectD objd_;//ObjectD 没有默认的构造函数,也需要在初始化列表中构造
};
int main(void)
{
	Derived d(100,200);
	//cout<<d.b_<<"  "<<d.d_<<endl;
	Derived d2(d);
	cout<<d2.d_<<endl;
  return 0;
}
//4 中情况下,在初始化列表中调用
//const 成员
//引用成员
//类的对象成员没有默认构造函数的时候,只能够在类的构造函数初始化列表中中调用该对象的构造函数进行初始化
//基类没有默认构造函数的时候,基类的构造函数要在派生类构造函数初始化列表中调用

以上是继承和构造函数相关的。

友元关系不能被继承


假设:

A是B的友元类,(A可以访问B的所有成员)

C是A的派生类,那么C 不是B的友元类

友元关系是单向饿。

A是B的友元类,,(A可以访问B的所有成员),并不承认B是A的朋友.B不能访问A的保护的,私有的。

友元关系是不能被传递的。

A是B的友元类,B是C的友元类,那么A不是C的友元类。


静态成员与继承

    静态成员无所谓继承。静态成员是被所有的类共享的。内存只有一份拷贝。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值