美文网首页
C++语言-多态,纯虚函数,模版函数

C++语言-多态,纯虚函数,模版函数

作者: 大虾啊啊啊 | 来源:发表于2022-08-02 17:23 被阅读0次

    1、虚函数、纯虚函数

    class Person {
    public:
        //普通函数
        void onCreat() {
            cout << "Person onCreat" << endl;
        }
        //
        // 虚函数是不是不必须继承的
        virtual void onStart() {
            cout << "Person virtual onStart" << endl;
        }
    
        //纯虚函数是必须继承的
        virtual void onStop() = 0;
    
    };
    
    class Student : public Person {
    public:void onStop(){
            cout << "Student onStop" << endl;
        }
    };
    
    Student student;
        student.onStart();
        student.onStop();
    
    
    Person virtual onStart
    Student onStop
    

    需要注意的是,纯虚函数子类是必须继承的,虚函数不是不必须继承的。

    2、多态

    在C++中默认关闭多态,而在Java中默认打开多态。
    使用虚函数实现多态

    
    class Person {
    public:
        virtual void eat() {
            cout << "Person eat" << endl;
        }
    };
    
    class Student : public Person {
    public:
        void eat() {
            cout << "Student eat" << endl;
        }
    
    };
    
    class Teacher : public Person {
    public:
        void eat() {
            cout << "Teacher eat" << endl;
        }
    };
    
    void eat(Person *person) {
        person->eat();
    
    }
    
    
    int main() {
        Student *student = new Student();
        eat(student);
    
        Teacher *teacher = new Teacher();
        eat(teacher);
    }
    
    Student eat
    Teacher eat
    

    在这发现一个问题就是使用多态的时候,需要用指针对象,不能使用引用。

    3、全纯虚函数实现回调

    class ILogin {
    public:
        virtual void loginSuccess(string msg) = 0;
    };
    
    class LoginImpl : public ILogin {
        void loginSuccess(string msg) {
            cout << msg << endl;
        }
    };
    
    void login(string username, string pwd, ILogin *login) {
        if (username == "daxia" && pwd == "123") {
            login->loginSuccess("login success");
        }
    }
    
    
    int main() {
        LoginImpl *loginImpl = new LoginImpl();
        login("daxia", "123", loginImpl);
        if (loginImpl) {
            delete loginImpl;
            loginImpl = NULL;
        }
    }
    

    全纯虚函数实现回调(模仿Java接口回调),我们创建的对象也是指针对象,而不能使用引用。

    4、模版函数

    模版函数类似Java中的泛型

    template<typename T>
    void add(T t1, T t2) {
        cout << t1+t2 << endl;
    }
    int main() {
        add(1,2);
    }
    

    5、构造函数中两种成员初始化方式

    • 使用this关键字
    class Pig {
    public:
        string name;
        Pig() {
        }
        Pig(string name) {
            this->name = name;
        }
    };
    
    class People {
    public:
        int age = 0;
        Pig pig;
    
        People(int age, Pig pig) {
            this->age = age;
            this->pig = pig;
            cout << this->age <<" "<< this->pig.name << endl;
        }
    };
    
    int main() {
        Pig pig("xiaoming");
        People people(12, pig);
    }
    
    • 使用冒号
    class Pig {
    public:
        string name;
        Pig() {
        }
        Pig(string name) {
            this->name = name;
        }
    };
    
    class People {
    public:
        int age = 0;
        Pig pig;
        People(int age, Pig pig):age(age),pig(pig) {
            cout << this->age <<" "<< this->pig.name << endl;
        }
    };
    
    int main() {
        Pig pig("xiaoming");
        People people(12, pig);
    }
    

    6、继承关系子父类构造函数、析构函数执行顺序

    class Object {
    public:
        string name;
        Object(string name) {
            this->name = name;
            cout << "Object Construct" << endl;
        }
        ~Object(){
            cout << "Object Xigou" << endl;
        }
    
    };
    class Activity:Object{
    public:
        int age;
        Activity(int age,string name): Object(name){
            cout << "Activity Construct" << endl;
        }
        ~Activity(){
            cout << "Activity Xigou" << endl;
        }
    };
    
    
    int main() {
        Activity activity(12,"xiaohong");
    }
    
    Object Construct
    Activity Construct
    Activity Xigou
    Object Xigou
    

    执行顺序: 父类构造函数->子类构造函数->子类析构函数->父类析构函数

    相关文章

      网友评论

          本文标题:C++语言-多态,纯虚函数,模版函数

          本文链接:https://www.haomeiwen.com/subject/tsrjwrtx.html