继承, 虚函数

继承函数, 虚函数

继承, 说的通俗点就是拥有了父类的一部分特征. 我们叫继承的一方为派生类, 被继承的一方叫做基类.
派生类继承了父类除了private的所有特征.


#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>
#include <memory>

//类的声明;
class T;
class T1;
class T2;


//基类
class T
{
public:
	T() = default;
	T(const int X, std::string str1) : x(X), str(str1) {}
	~T() = default;

	virtual void Fun1() { std::cout << x * 2 << "   " << str + "abc" << '\n'; }
	//不能将T 中的Fun2()当成虚函数了
	virtual void Fun2() final { std::cout << x << "   " << str << '\n'; }

private:
	int x;
	std::string str;
	friend class T1;			//将T1当做T的友元; T1可访问T的private成员;
};

//派生类
class T1 : public T
{
public:
	T1() = default;
	T1(int X, std::string str1, int Y) : T(X, str1), y(Y) {}
	~T1() = default;

private:
	int y;
	friend class T2;			//将T2当做T的友元; T2可访问T1的private成员;
};

//派生类 , 虚函数;
//final : 防止 T2 做为基类, T2不能被继承;
class T2 final : public T
{
public:
	//using T::T; 继承了T的构造函数, 当using作用于构造函数时, 编译器会将其产生代码, 做为了解;

	T2() = default;
	T2(int X, std::string str1, int Y) : T(X, str1), y(Y) {}

	//虚函数, 与基类有一样的函数名以及传入参数, 一般可以在基类的函数前加入virtual, 派生类函数后加入override;
	void Fun1() override
	{ std::cout << y * 10 << std::endl; }
	//void Fun1() { std::cout << y * 10 << std::endl; }

	//Fun2()防止被当成虚函数;
	//void Fun2() override {}
	//现在Fun2(int) 隐藏了T中的Fun()函数, 不是重载;
	void Fun2(int)
	{
		std::cout << y << std::endl;
		//友元不能传递;
		//T2是T1 的友元, T1 是 T的友元, 但是 T2 不是 T 的友元;
		//std::cout << x << std::endl;
	}

private:
	int y;
};


int main()
{
	std::cout << "vector T : " << std::endl;
	std::vector<T> vec;
	vec.push_back(T(1, "123"));

	std::cout << "\n\nvector T1 : " << std::endl;
	vec.back().Fun1();
	vec.push_back(T1(2, "abc", 4));
	vec.back().Fun2();

	std::vector<std::shared_ptr<T>> vec1;
	vec1.push_back(std::make_shared<T>(5, "bcd"));
	vec1.back()->Fun1();

	std::cout << "\n\nT2 : " << std::endl;
	T2 t2(1, "abcd", 4);
	t2.Fun1();
	t2.T::Fun1();
	t2.Fun2(0);					//t2访问T2中的Fun2(int), 需要传入参数, 因为T2中Fun2(int)将T中的Fun2()隐藏了, 而不是重载了Fun2();
	t2.T::Fun2();				//访问T中的Fun2()函数;

	//用T2来构造T, 将T2中多余的参数丢弃, 只要了T所需要的参数量;
	std::cout << "\n\nT : " << std::endl;
	T t(t2);
	t.Fun2();

	system("pause");
	return 0;
}


习惯将知识点放在代码里, 因为这是我边写代码边写注释, 看代码就相对容易理解,贡以后的看, 所以是随笔记录.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值