继承函数, 虚函数
继承, 说的通俗点就是拥有了父类的一部分特征. 我们叫继承的一方为派生类, 被继承的一方叫做基类.
派生类继承了父类除了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;
}
习惯将知识点放在代码里, 因为这是我边写代码边写注释, 看代码就相对容易理解,贡以后的看, 所以是随笔记录.