b站Cherno的课[27]-[30]
一、C++继承 public
继承允许有一个相互关联的类的层次结构
允许有一个包含公共功能的基类
允许我们从那个基类中分离出来,从最初的父类中创建子类
作用:避免代码重复
多态:单一类型,但有多个类型
创建一个子类,它将包含你的父类所包含的一切
Entity
#include <iostream>
class Entity
{
public:
float X, Y;
void Move(float xa, float ya)
{
X += xa;
Y += ya;
}
};
class Player:public Entity
{
public:
const char* Name;
void PrintName()
{
std::cout << Name << std::endl;
}
};
int main()
{
std::cout << sizeof(Entity) << std::endl;
Player player;
player.Move(5, 5);
player.X = 2;
std::cin.get();
}

Player
#include <iostream>
class Entity
{
public:
float X, Y;
void Move(float xa, float ya)
{
X += xa;
Y += ya;
}
};
class Player:public Entity
{
public:
const char* Name;
void PrintName()
{
std::cout << Name << std::endl;
}
};
int main()
{
std::cout << sizeof(Player) << std::endl;
Player player;
player.Move(5, 5);
player.X = 2;
std::cin.get();
}

如果开始重写函数和Player类,那么需要维护一个V表(虚函数表)
public 继承:保留基类成员的原有访问权限(最常用)。
protected/private 继承:降低基类成员的访问权限(极少使用)。
#include <iostream>
using namespace std;
// 基类:动物
class Animal {
public:
void eat() { cout << "吃东西" << endl; }
protected:
void breathe() { cout << "呼吸" << endl; }
private:
void heartbeat() { cout << "心跳" << endl; }
};
// 派生类:猫(public 继承)
class Cat : public Animal {
public:
void meow() {
eat(); // OK:基类 public 成员 → 子类 public
breathe(); // OK:基类 protected → 子类 protected
// heartbeat(); // 错误:基类 private 成员不可访问
cout << "喵喵叫" << endl;
}
};
int main() {
Cat myCat;
myCat.eat(); // 输出 "吃东西"
myCat.meow(); // 输出 "呼吸" 和 "喵喵叫"
// myCat.breathe(); // 错误:protected 成员不能在类外访问
}

二、C++虚函数 virtual
虚函数:允许我们在子类中重写方法
构造函数初始值列表

#include <iostream>
#include <string>
class Entity
{
public:
std::string GetName() { return "Entity"; }
};
class Player:public Entity
{
private:
std::string m_Name;
public:
Player(const std::string& name)
: m_Name(name){}
std::string GetName() { return m_Name; }
};
int main()
{
Entity* e = new Entity();
std::cout << e->GetName() << std::endl;
Player* p = new Player("wm");
//通过指针 p 调用 Player 类对象的 GetName() 成员函数
//p->GetName() 等价于 (*p).GetName()。
std::cout << p->GetName() << std::endl;
std::cin.get();
}

在 C++ 中,std:: 是 标准库命名空间(Standard Namespace)的标识符,所有 C++ 标准库提供的功能(如容器、算法、字符串处理等)都封装在这个命名空间中。
int main()
{
Entity* e = new Entity();
std::cout << e->GetName() << std::endl;
Player* p = new Player("wm");
std::cout << p->GetName() << std::endl;
Entity* entity = p;
std::cout << entity->GetName() << std::endl;
std::cin.get();
}

#include <iostream>
#include <string>
class Entity
{
public:
std::string GetName() { return "Entity"; }
};
class Player:public Entity
{
private:
std::string m_Name;
public:
Player(const std::string& name)
: m_Name(name){}
std::string GetName() { return m_Name; }
};
void PrintName(Entity* entity)
{
std::cout << entity->GetName() << std::endl;
}
int main()
{
Entity* e = new Entity();
PrintName(e);
Player* p = new Player("wm");
PrintName(p);
std::cin.get();
}

通常声明函数时,我们的方法通常在类内部起作用,
当调用方法时,会调用属于该类型的方法
虚函数引用了一种Dynamic Dispatch(动态联编),通常通过v表(虚函数表)来实现编译。
v表,包含基类中所有虚函数的映射,保证在运行时,映射到正确的覆写override函数。
若想覆写一个函数,必须将基类中的基函数标记为虚函数
class Entity
{
public:
virtual std::string GetName() { return "Entity"; }
};
class Player:public Entity
{
private:
std::string m_Name;
public:
Player(const std::string& name)
: m_Name(name){}
std::string GetName() override{ return m_Name; }
};





三、C++接口(纯虚函数) virtual…=0
纯虚函数允许我们在基类中定义一个没有实现的函数,然后强制子类去实现该函数
类中的接口interface只包含未实现的方法,作为模版
#include <iostream>
#include <string>
class Printable
{
public:
//纯虚函数
virtual std::string GetClassName() = 0;
};
class Entity :public Printable
{
public:
virtual std::string GetName() { return "Entity"; }
std::string GetClassName() { return "Entity"; }
};
class Player:public Entity
{
private:
std::string m_Name;
public:
Player(const std::string& name)
: m_Name(name){}
std::string GetName() override{ return m_Name; }
};
void PrintName(Entity* entity)
{
std::cout << entity->GetName() << std::endl;
}
void Print(Printable* obj)
{
std::cout << obj->GetClassName() << std::endl;
}
int main()
{
Entity* e = new Entity();
//PrintName(e);
Player* p = new Player("wm");
//PrintName(p);
Print(e);
Print(p);
std::cin.get();
}

#include <iostream>
#include <string>
class Printable
{
public:
//纯虚函数
virtual std::string GetClassName() = 0;
};
class Entity :public Printable
{
public:
virtual std::string GetName() { return "Entity"; }
std::string GetClassName()override { return "Entity"; }
};
class Player:public Entity
{
private:
std::string m_Name;
public:
Player(const std::string& name)
: m_Name(name){}
std::string GetName() override{ return m_Name; }
std::string GetClassName() override { return "Player"; }
};
void PrintName(Entity* entity)
{
std::cout << entity->GetName() << std::endl;
}
void Print(Printable* obj)
{
std::cout << obj->GetClassName() << std::endl;
}
int main()
{
Entity* e = new Entity();
//PrintName(e);
Player* p = new Player("wm");
//PrintName(p);
Print(e);
Print(p);
std::cin.get();
}

#include <iostream>
#include <string>
class Printable
{
public:
//纯虚函数
virtual std::string GetClassName() = 0;
};
class Entity :public Printable
{
public:
virtual std::string GetName() { return "Entity"; }
std::string GetClassName()override { return "Entity"; }
};
class Player:public Entity
{
private:
std::string m_Name;
public:
Player(const std::string& name)
: m_Name(name){}
std::string GetName() override{ return m_Name; }
std::string GetClassName() override { return "Player"; }
};
void PrintName(Entity* entity)
{
std::cout << entity->GetName() << std::endl;
}
class A :public Printable
{
public:
std::string GetClassName() override { return "A"; }
};
void Print(Printable* obj)
{
std::cout << obj->GetClassName() << std::endl;
}
int main()
{
Entity* e = new Entity();
//PrintName(e);
Player* p = new Player("wm");
//PrintName(p);
Print(e);
Print(p);
Print(new A());
std::cin.get();
}

使用纯函数之后,main函数调用就不能随便实例化,此时定义一个接口,用于对接基类和子类,使之能够实例化从而让main调用
虚函数:可以有默认实现,也可以在派生类(子类)中重写,可以实例化基类(父类)。通过(virtual)声明。
纯虚函数:没有默认实现,只在基类(父类)中声明且必须在派生类(子类)中重写,不能实例化基类(父类)。使用virtual与"=0"声明。
override的作用:c++ 11的特性,告诉你这是个覆写函数,增加可读性,而且还会检测函数名字是否写错,减少低级bug
四、C++可见性
可见性是一个属于面向对象编程的概念,指的是类的某些成员或方法实际上有多可见
C++三个基础的可见性修饰符:private、protected和public
default可见性修饰符
C# internal
C++中friend关键字,可以让类或者函数成为类Entity的朋友(友元)
可以从类中访问私有成员
protected比private更可见,比public更不可见

2323

被折叠的 条评论
为什么被折叠?



