C++类入门程序源码240717
立即下载
资源介绍:
C++类入门程序源码240717
#include
class Printable{
public:
virtual std::string GetClassName() = 0;
};
class Entity : public Printable{
public:
enum Level : unsigned short{
low = 0, mid, high
};
Entity(){ // 构造函数,用于初始化
x = 10;
y = 20;
std::cout << "Created Entity!" << std::endl;
}
Entity(int new_x){ // 函数重载:相同的方法名,不同的参数
x = new_x;
std::cout << "Created Entity!" << std::endl;
}
~Entity(){ // 析构函数,销毁对象时执行,清理堆栈分配的内存
std::cout << "Destoryed Entity!" << std::endl;
}
void SetLevel(Level lv){ level = lv; }
void Move(int xa, int ya){ x += xa; y += ya;}
int get_x(){ return x; }
int get_y(){ return y; }
void Print(){
std::cout << x << " " << y << " " << level << std::endl;
}
virtual std::string GetType(){ return "Entity"; } // ->虚函数
//virtual std::string GetType() = 0; // ->纯虚函数,
//提供接口,强制子函数实现。Entity不可实例化,需实例化子类。
// 如果子类不覆写该函数接口,子类也不可实例化。
std::string GetClassName() override {
return "Entity";
}
private: // private只有Entity类或者友元类可以访问。protect=可继承private
int x;
int y;
Level level = low;
};
class Player : public Entity/* , Printable */{ //继承。父子同时继承同一个类,覆写同一个函数,会出现歧义
public:
Player(const std::string& name):Name(name){
}
std::string GetName(){ return Name; }
void Print(){
std::cout << get_x() << get_y() << Name << std::endl;
}
std::string GetType(){
return "Player";
}
std::string GetClassName() override { return "Player"; }
private:
std::string Name;
};
class Person{
public:
Person()
: m_Name("Unknown"), m_Score(0){} // 可能需要按顺序写
Person(const std::string& name)
: m_Name(name), m_Score(0){}
// 这么初始化变量的好处是,不会在该对象作为其他对象的private时被初始化两次,浪费性能。
// eg: 在Entity类:{private: Example m_example; public:m_Example(8);}
// 会显示创建了两次对象。
// 如果是:Entity():m_Example(Example){}
void GetName(){ std::cout<< m_Name << std::endl; }
private:
int m_Score;
std::string m_Name;
};
void PrintName(Entity* entity){ std::cout << entity->GetType() << std::endl; }
void Print(Printable* obj){ std::cout << obj->GetClassName() << std::endl; }
int main(){
//类的实现和继承
//Entity entity1;
//entity1.SetLevel(Entity::high); // enum看作一个命名空间
// Entity entity2(20);
// entity2.Print(); // 20 0 0 y没有初始化
// Player player1("Player233");
// player1.Print();
// Player player2(player1.GetName());
// player2.Print();
//虚函数
// Entity* e = new Entity();
// std::cout << e->GetType() << std::endl;
// Player* p = new Player("aname");
// std::cout << p->GetType() << std::endl;
// Entity* entity = p;
// std::cout << entity->GetType() << std::endl;
//期望player,但是entity,则需要在entity的GetType加virtual ->虚函数
//无virtual Entity; 有则Player
//或者将子函数写为:std::string GetType() override {}
//提高可读性,并且当父类中无可覆写函数时会报错提示。
//纯虚函数
Player *p = new Player("aono");
Person p1;
p1.GetName();
Person p2("Cherno");
p2.GetName();
// 在栈和堆上创建对象的区别:
// 以上都是创建在堆栈里,main()结束后销毁。
// 创建在栈内的数据,在一个作用域结束之后(一对花括号内),里面的内存会被全部销毁。
// 如果不希望对象在某个子函数中创建,还没来得及用就销毁,那就需要在堆中创建对象。
Person *person = new Person("Cherno");
(*person).GetName();
person->GetName(); // 这两种调用方法等效
delete person;
}