继承
**//父类
class Person
{
public:
int age, height;
void sayHello()
{
std::cout << "你好啊" << std::endl;
}
};
//子类继承父类
class Man : public Person
{
public:
void sayBye()
{
std::cout << "再见" << std::endl;
}
};
int main()
{
Man man;
//子类可以调用父类的属性
man.age = 10;
man.height = 175;
man.sayHello();
std::cout << man.age << std::endl;
std::cout << man.height << std::endl;
man.sayBye();
//控制台打印
//你好啊
//10
//175
//再见
std::cin.get();
}**
虚函数virtual
在父类的方法中,正确的使用虚函数修饰,子类覆写父类的方法的时候,才能正确的找到子类的覆写方法。
//virtual虚函数允许在子类重写方法
class Entity
{
public:
//std::string GetName() { return "Entity"; }
// 添加虚函数标记
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; }
};
void PrintName(Entity* entity)
{
std::cout << entity->GetName() << std:: endl;
}
int main()
{
Entity* e = new Entity();
PrintName(e);
Player* p = new Player("Cherno");
PrintName(p);
//Entity
//Cherno
//如果在多态下打印都是Entity
Entity* entity = p;
PrintName(entity);
//虚函数通过虚函数表映射到正确的覆写函数 override
//Entity
//Cherno
//Cherno
//使用virtual标记 能正确的找到子类的覆写方法
//所以子类要覆写父类的函数,要将弗雷德函数改为虚函数
std::cin.get();
}
纯虚函数
纯虚函数允许我们在基类中定义一个没有实现的函数,然后强制子类去实现该函数。
类似于java中的接口的概念,c++没有接口,都是类。在类中使用纯虚函数定义模板,通过子类去实现方法定义。
//纯虚函数允许我们在基类中定义一个没有实现的函数,然后强制子类去实现该函数
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,public Printable
{
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 Print(Printable* obj)
{
std::cout << obj->GetClassName() << std::endl;
}
int main()
{
Entity* e = new Entity();
Player* p = new Player("Cherno");
Print(e);
Print(p);
std::cin.get();
}