C++学习第十二课:继承的奥秘与应用

C++学习第十二课:继承的奥秘与应用

继承是面向对象编程的基石之一,它允许创建新类(派生类)来扩展或修改现有类(基类)的行为。C++支持多种继承方式,包括私有继承、保护继承和多继承。本课将深入探讨继承的基础知识,不同继承方式的特点,以及如何在实际编程中应用继承。

1. 继承基础

  • 基类与派生类:派生类是继承基类属性和方法的类。
  • 声明继承:使用 : 后跟基类名来声明继承。
class Base {
public:
    void baseFunc() {}
};

class Derived : public Base {
    // 继承公有成员
};

int main() {
    Derived d;
    d.baseFunc(); // 派生类对象可以访问基类的公有成员
    return 0;
}

2. 私有继承(private)

  • 私有继承:基类的所有成员在派生类中都是私有的。
class Base {};

class DerivedPrivate : private Base {
    // Base的所有成员在DerivedPrivate中都是私有的
};

int main() {
    DerivedPrivate dp; // 不能访问Base的成员
    return 0;
}

3. 保护继承(protected)

  • 保护继承:基类的公有和保护成员在派生类中都是保护的。
class Base {
protected:
    int protMember;
};

class DerivedProtected : protected Base {
    // protMember在DerivedProtected中是保护的
};

int main() {
    DerivedProtected dp;
    dp.protMember = 10; // 可以访问,但外部代码不能访问dp.protMember
    return 0;
}

4. 切除问题(Diamond Problem)

  • 多继承:一个类可以继承多个基类。
  • 切除问题:当多个基类有一个共同的基类时,会出现继承结构中的歧义。
class Base1 {
public:
    int member;
};

class Base2 : virtual public Base1 {
    // 虚继承Base1,以解决切除问题
};

class Derived : public Base2, public Base1 {
    // Derived有两个Base1的副本
};

int main() {
    Derived d;
    // 如何访问member?需要明确指出是哪个Base1的member
    return 0;
}

5. 多继承

  • 多继承:允许派生类从多个基类继承属性和方法。
class Base1 {
public:
    void func1() {}
};

class Base2 {
public:
    void func2() {}
};

class MultiDerived : public Base1, public Base2 {
    // 继承自Base1和Base2
};

int main() {
    MultiDerived md;
    md.func1(); // 调用Base1的func1
    md.func2(); // 调用Base2的func2
    return 0;
}

6. 构造函数和析构函数在继承中的使用

  • 派生类的构造函数:必须调用基类的构造函数。
  • 析构函数:析构函数顺序是构造函数顺序的逆序。
class Base {
public:
    Base() { std::cout << "Base constructor called" << std::endl; }
    ~Base() { std::cout << "Base destructor called" << std::endl; }
};

class Derived : public Base {
public:
    Derived() { std::cout << "Derived constructor called" << std::endl; }
    ~Derived() { std::cout << "Derived destructor called" << std::endl; }
};

int main() {
    Derived d; // 调用Derived的构造函数,然后调用Base的构造函数
    // main函数结束时,先调用Derived的析构函数,再调用Base的析构函数
    return 0;
}

7. 访问控制和继承

  • 公有继承:基类的公有成员在派生类中变为公有。
  • 私有继承:基类的公有和保护成员在派生类中变为私有。
  • 保护继承:基类的公有和保护成员在派生类中变为保护。
class Base {
public:
    int publicVar;
protected:
    int protectedVar;
private:
    int privateVar;
};

class Derived : public Base {
    // Derived::publicVar 是公有的
    // Derived::protectedVar 是保护的
    // Derived::privateVar 是私有的,不能直接访问
};

8. 虚基类和继承中的类型转换

  • 虚基类:使用 virtual 关键字声明基类继承,解决多继承中的钻石问题。
class Base1 {
public:
    int b1;
};

class Base2 : virtual public Base1 {
public:
    int b2;
};

class Derived : public Base2 {
public:
    int d;
};

int main() {
    Derived d;
    // 通过虚基类,可以进行安全的类型转换
    Base1& b1Ref = d;
    return 0;
}

结语

通过本课的学习,你了解了C++中继承的基础知识,包括不同继承方式的特点、构造函数和析构函数在继承中的使用,以及如何通过虚基类解决多继承中的钻石问题。

继承是面向对象编程中实现代码重用和扩展功能的重要机制。正确使用继承可以提高代码的可维护性和可扩展性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值