美文网首页
c++ 多继承与虚继承

c++ 多继承与虚继承

作者: arkliu | 来源:发表于2022-11-23 09:11 被阅读0次

菱形继承与虚继承

#include <iostream>

using namespace std;
// 多继承与虚继承
class Furnature {
    public:
        int m;
}

// 将父亲类继承爷爷类的时候,改为虚继承,防止儿子在多继承我的时候,出现爷爷中的变量会考别多份
class Bed : virtual public Furnature{
    public:
        void sleep() {
            cout << "在床上睡觉..." << endl;
        }
};

class Sofa : virtual public Furnature {
    public:
        void sit() {
            cout << "在沙发上休息..." << endl;
        }
};

//沙发床
class SofaBed :public Bed, public Sofa {
    public:
        void sleepAndSit() {
            sleep();
            sit();
        }
};

int main() {
    SofaBed sb;
    sb.sleepAndSit();

    sb.m = 300;
    return 0;
}
image.png

虚函数的应用场景

问题引出

#include <iostream>

using namespace std;

class Human {
    public:
        double age;
        Human() {
            age = 33;
        }
        //void say() {
        virtual void say() {
            cout << "human  :" << age << endl;
        }
};

class Student : public Human {
    public:
        void say() override{
            cout << "Student  :" << age << endl;
        }
};

void sayEx(Human * p) {
    p->say();
}

int main() {
    Student * s1 = new Student(); 
    Human * h1 = new Human();
    // 明明给了Student类型的指针,确调用的父类方法,解决:将父类中的say方法实现为虚方法
    sayEx(s1); // human  :33  
    delete s1;
    delete h1;

    return 0;
}

纯虚函数

纯虚函数定义

class <类名>
{
virtual <类型><函数名>(<参数表>)=0;
};

在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用

#include <iostream>

using namespace std;

class Printable {
    public:
        virtual void ClassName() = 0;
};


class Human : public Printable{
    public:
        double age;
        
        Human() {
            age = 33;
        }
        virtual void say() {
            cout << "Human  :" << age << endl;
        }

        void ClassName() {
            cout << "Human ..." << endl;
        }
};

class Student : public Human {
    public:
        void say() override{
            cout << "Student  :" << age << endl;
        }

        void ClassName() {
            cout << "Student ..." << endl;
        }
};

void print(Printable * p) {
    p->ClassName();
}

int main() {
    Student * s1 = new Student(); 
    Human * h1 = new Human();
    
    print(s1); //Student ...
    print(h1); // Human ...

    delete s1;
    delete h1;

    return 0;
}

相关文章

网友评论

      本文标题:c++ 多继承与虚继承

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