C

C++继承相关示例

admin 默认分类 2025-03-28
#include <iostream>
#include <string>

using namespace std;

/*
 * 基类1 - 动物类
 * 包含纯虚函数,是抽象类
 */
class Animal {
protected:
    string name;
    int age;

public:
    /* 构造函数 */
    Animal(const string& name, int age) : name(name), age(age) {
        cout << "Animal构造函数被调用" << endl;
    }

    /* 虚函数 - 可以被派生类覆盖 */
    virtual void makeSound() const {
        cout << "动物发出声音" << endl;
    }

    /* 纯虚函数 - 使类成为抽象类,派生类必须实现 */
    virtual void eat() const = 0;

    /* 非虚函数 - 不建议在派生类中覆盖 */
    void sleep() const {
        cout << name << "正在睡觉" << endl;
    }

    /* 虚析构函数 - 确保派生类对象被正确销毁 */
    virtual ~Animal() {
        cout << "Animal析构函数被调用" << endl;
    }
};

/*
 * 基类2 - 可飞行接口
 * 纯抽象类
 */
class Flyable {
public:
    virtual void fly() const = 0;
    virtual ~Flyable() = default;
};

/*
 * 基类3 - 可游泳接口
 * 包含默认实现的虚函数
 */
class Swimmable {
public:
    virtual void swim() const {
        cout << "在水中游泳" << endl;
    }
    virtual ~Swimmable() = default;
};

/*
 * 派生类1 - 公有继承
 * Dog 公有继承自 Animal
 */
class Dog : public Animal {
private:
    string breed;

public:
    /* 构造函数 */
    Dog(const string& name, int age, const string& breed) 
        : Animal(name, age), breed(breed) {
        cout << "Dog构造函数被调用" << endl;
    }

    /* 覆盖基类的虚函数 */
    void makeSound() const override {
        cout << name << "汪汪叫" << endl;
    }

    /* 实现基类的纯虚函数 */
    void eat() const override {
        cout << name << "正在吃狗粮" << endl;
    }

    /* 派生类特有的方法 */
    void fetch() const {
        cout << name << "正在接飞盘" << endl;
    }

    /* 析构函数 */
    ~Dog() override {
        cout << "Dog析构函数被调用" << endl;
    }
};

/*
 * 派生类2 - 多重继承
 * Duck 同时继承自 Animal, Flyable 和 Swimmable
 */
class Duck : public Animal, public Flyable, public Swimmable {
public:
    /* 构造函数 */
    Duck(const string& name, int age) : Animal(name, age) {
        cout << "Duck构造函数被调用" << endl;
    }

    /* 覆盖Animal的虚函数 */
    void makeSound() const override {
        cout << name << "嘎嘎叫" << endl;
    }

    /* 实现Animal的纯虚函数 */
    void eat() const override {
        cout << name << "正在吃小鱼和谷物" << endl;
    }

    /* 实现Flyable的纯虚函数 */
    void fly() const override {
        cout << name << "正在飞翔" << endl;
    }

    /* 覆盖Swimmable的虚函数 */
    void swim() const override {
        cout << name << "正在水上游泳" << endl;
    }

    /* 析构函数 */
    ~Duck() override {
        cout << "Duck析构函数被调用" << endl;
    }
};

/*
 * 派生类3 - 保护继承
 * ProtectedDerived 保护继承自 Animal
 */
class ProtectedDerived : protected Animal {
public:
    /* 构造函数 */
    ProtectedDerived(const string& name, int age) : Animal(name, age) {}

    /* 
     * 保护继承后,基类的公有成员在派生类中变为保护成员
     * 可以通过派生类的公有方法间接访问
     */
    void showInfo() const {
        cout << "保护继承示例: " << name << ", " << age << "岁" << endl;
        makeSound();  /* 可以访问基类的protected成员 */
    }

    /* 实现基类的纯虚函数 */
    void eat() const override {
        cout << "保护继承的eat实现" << endl;
    }
};

/*
 * 派生类4 - 私有继承
 * PrivateDerived 私有继承自 Animal
 */
class PrivateDerived : private Animal {
public:
    /* 构造函数 */
    PrivateDerived(const string& name, int age) : Animal(name, age) {}

    /* 
     * 私有继承后,基类的公有和保护成员在派生类中变为私有成员
     * 可以通过派生类的公有方法间接访问
     */
    void showInfo() const {
        cout << "私有继承示例: " << name << ", " << age << "岁" << endl;
        makeSound();  /* 可以访问基类的protected成员(现在是private) */
    }

    /* 实现基类的纯虚函数 */
    void eat() const override {
        cout << "私有继承的eat实现" << endl;
    }
};

/*
 * 虚继承示例 - 解决菱形继承问题
 * Base 作为虚基类
 */
class Base {
public:
    int data;
    Base(int val) : data(val) {}
    virtual ~Base() = default;
};

/* Derived1 虚继承自 Base */
class Derived1 : virtual public Base {
public:
    Derived1(int val) : Base(val) {}
};

/* Derived2 虚继承自 Base */
class Derived2 : virtual public Base {
public:
    Derived2(int val) : Base(val) {}
};

/* FinalDerived 继承自 Derived1 和 Derived2 */
class FinalDerived : public Derived1, public Derived2 {
public:
    /* 虚基类由最终派生类初始化 */
    FinalDerived(int val1, int val2) : Base(val1), Derived1(val1), Derived2(val2) {}
};

int main() {
    /* 1. 公有继承示例 */
    cout << "===== 公有继承示例 =====" << endl;
    Dog myDog("Buddy", 3, "Golden Retriever");
    myDog.makeSound();  /* 调用派生类覆盖的方法 */
    myDog.eat();        /* 调用派生类实现的纯虚函数 */
    myDog.sleep();      /* 调用继承的基类方法 */
    myDog.fetch();      /* 调用派生类特有的方法 */

    /* 通过基类指针访问 */
    Animal* animalPtr = &myDog;
    animalPtr->makeSound();  /* 多态行为,调用Dog的实现 */

    /* 2. 多重继承示例 */
    cout << "\n===== 多重继承示例 =====" << endl;
    Duck myDuck("Donald", 2);
    myDuck.makeSound();  /* Animal的方法 */
    myDuck.fly();        /* Flyable的方法 */
    myDuck.swim();       /* Swimmable的方法 */

    /* 通过不同基类指针访问 */
    Flyable* flyPtr = &myDuck;
    flyPtr->fly();

    Swimmable* swimPtr = &myDuck;
    swimPtr->swim();

    /* 3. 保护继承示例 */
    cout << "\n===== 保护继承示例 =====" << endl;
    ProtectedDerived pd("Protected", 5);
    pd.showInfo();
    /* pd.makeSound();  // 错误: makeSound在ProtectedDerived中是protected的 */

    /* 4. 私有继承示例 */
    cout << "\n===== 私有继承示例 =====" << endl;
    PrivateDerived prd("Private", 7);
    prd.showInfo();
    /* prd.makeSound();  // 错误: makeSound在PrivateDerived中是private的 */

    /* 5. 虚继承示例 */
    cout << "\n===== 虚继承示例 =====" << endl;
    FinalDerived fd(10, 20);
    /* 没有虚继承时,这里会有二义性 */
    cout << "data = " << fd.data << endl;  /* 输出10,因为由FinalDerived初始化 */

    /* 6. 对象销毁顺序 */
    cout << "\n===== 对象销毁顺序 =====" << endl;
    /* 观察对象销毁时的析构函数调用顺序 */
    /* 析构顺序与构造顺序相反,先派生后基类 */

    return 0;
}

编译:g++ main.cpp -std=c++11
输出如下:
===== 公有继承示例 =====
Animal构造函数被调用
Dog构造函数被调用
Buddy汪汪叫
Buddy正在吃狗粮
Buddy正在睡觉
Buddy正在接飞盘
Buddy汪汪叫

===== 多重继承示例 =====
Animal构造函数被调用
Duck构造函数被调用
Donald嘎嘎叫
Donald正在飞翔
Donald正在水上游泳
Donald正在飞翔
Donald正在水上游泳

===== 保护继承示例 =====
Animal构造函数被调用
保护继承示例: Protected, 5岁
动物发出声音

===== 私有继承示例 =====
Animal构造函数被调用
私有继承示例: Private, 7岁
动物发出声音

===== 虚继承示例 =====
data = 10

===== 对象销毁顺序 =====
Animal析构函数被调用
Animal析构函数被调用
Duck析构函数被调用
Animal析构函数被调用
Dog析构函数被调用
Animal析构函数被调用

评论(111)

发布评论
  1. 成功女性

  2. 鬼屋直播

  3. 内特巴加兹的纳什维尔圣诞节

  4. 提着心吊着胆

  5. 警魂

  6. 不再欺骗

  7. 怒火追击

  8. 人蛇大战李劲峰

  9. 我和我的第二故乡

  10. 打倒他们

  11. 喋血双雄粤配

  12. 圣诞计划

  13. 瞒天过海

  14. 设局

  15. 记忆奇旅

  16. 谍影重重4

  17. 好莱坞圣诞

  18. 寄了一整个春天

  19. 带着宠物躲战乱

  20. 阿尔格拉菲

  21. 卡萨托里亚

  22. 简单事情

  23. 布塔达姆巴斯卡纳拉亚纳

  24. 金鱼

  25. 一代爱国高僧圆瑛

  26. 除恶飞车党

  27. 妈妈别走

  28. 隔墙有情人

  29. 古董计中计之龙璧之战

  30. 莱拉

  31. 过细

  32. 步枪俱乐部

  33. 演员

  34. 绝境

  35. 黑猫

  36. 环游地球八十天

  37. 太空小子杰特之太空营地

  38. 梦之婚礼

  39. 倚天屠龙记之九阳神功

  40. 马1956

  41. 突破者

  42. 梁祝

  43. 美洲大陆

  44. 太空神鹰

  45. 雪豹之虎啸军魂

  46. 王者归来

  47. 新龙门客栈

  48. 演员

  49. 星际旅行10复仇女神

  50. 总是有爱在隔离粤配

  51. 火线追凶之冲破黑幕

  52. 怪物大乱捣

  53. 不再欺骗

  54. 方世玉粤配

  55. 绝地重生

  56. 引爆者

  57. 女心理师之心迷水影

  58. 油鬼子

  59. 破地狱

  60. 尸检6死者的秘密

  61. 暴走财神6

  62. 新流氓医生

  63. 穷养攻略

  64. 多想和你再见一面

  65. 银魂剧场新译红樱篇

  66. 环游地球八十天

  67. 不良影响小网红大黑幕

  68. 月球时代白日梦

  69. 小教父

  70. 暴裂无声

  71. 3年8班

  72. 橡皮头

  73. 降妖功德簿

  74. 哭泣的女人

  75. 血十三

  76. 悟空传

  77. 少女不毕业

  78. 美人鱼

  79. 3年8班

  80. 战锋对决

  81. 唤醒

  82. 贝茨先生与邮局真实的故事

  83. 钻石照耀钟鼓楼

  84. 小教父

  85. 3年8班

  86. 记忆大师

  87. 南少林之怒目金刚

  88. 狙击精英背水一战

  89. 大盘鸡

  90. 舞台姊妹1964

  91. 狄亚伯洛大决斗

  92. 到货即损doa

  93. 世界将不同

  94. 我的西门小故事

  95. 狼人杀启源

  96. 热搜

  97. 恶行之外

  98. 神秘教父

  99. 飞狐外传

  100. 驱魔天师

  101. 这是汤姆格林的纪录片

  102. 四大才子番外之真假唐伯虎

  103. 007之杀人执照

  104. 第一类型危险

  105. 婴儿车攻略

  106. 小情书

  107. 除匪

  108. 这个杀手不太冷静