C++的继承
概念
在C++中,继承是面向对象编程的一个重要特性,它允许一个类(派生类)从另一个类(基类)继承属性和方法,从而实现代码的重用和扩展。
- 基类(Base Class):被继承的类。
- 派生类(Derived Class):从基类派生出的类。-
继承类型
-
公有继承(Public Inheritance):
- 派生类可以访问基类的公有成员和保护成员。
- 基类的私有成员仍然不可被访问。
class Base {
public:
void pubFunc() { /* ... */ }
protected:
void protFunc() { /* ... */ }
private:
void privFunc() { /* ... */ }
};
class Derived : public Base {
void accessBase() {
pubFunc(); // 可以访问
protFunc(); // 可以访问
// privFunc(); // 不可访问
}
};
-
保护继承(Protected Inheritance):
- 派生类可以访问基类的公有和保护成员,但基类的公有成员在派生类外部被视为保护成员。
class Derived : protected Base {
void accessBase() {
pubFunc(); // 可以访问
protFunc(); // 可以访问
}
};
-
私有继承(Private Inheritance):
- 派生类只能访问基类的成员,其它类无法访问基类的公有和保护成员。
class Derived : private Base {
void accessBase() {
pubFunc(); // 可以访问
protFunc(); // 可以访问
}
};
构造函数和析构函数
- 派生类的构造函数会先调用基类的构造函数。
- 如果基类有构造函数,派生类必须在初始化列表中显式调用基类的构造函数(如果没有默认构造函数)。
class Base {
public:
Base(int x) { /* ... */ }
};
class Derived : public Base {
public:
Derived(int x) : Base(x) { /* ... */ }
};
方法重写(Overriding)
派生类可以重写基类中的虚函数。使用virtual关键字在基类中声明函数,在派生类中实现相同的函数名称和签名。
class Base {
public:
virtual void show() { std::cout << "Base show" << std::endl; }
};
class Derived : public Base {
public:
void show() override { std::cout << "Derived show" << std::endl; }
};
多重继承
C++支持多重继承,即一个类可以继承多个基类。
class Base1 {
public:
void func1() { /* ... */ }
};
class Base2 {
public:
void func2() { /* ... */ }
};
class Derived : public Base1, public Base2 {
public:
void useBase() {
func1();
func2();
}
};
虚基类
在多重继承时,可能会导致“菱形继承”问题。虚基类用于解决这个问题,确保只有一个基类实例。
class Base {
public:
Base() { std::cout << "Base Constructor" << std::endl; }
};
class Derived1 : virtual public Base {};
class Derived2 : virtual public Base {};
class Final : public Derived1, public Derived2 {};
继承的好处
1.代码重用:
- 派生类可以重用基类中的数据成员和方法,减少代码冗余,提升开发效率。
2.扩展性:
- 通过继承,您可以轻松添加新功能,只需创建派生类并实现或重写所需的方法,而无需修改基类。
3.多态性:
- 继承与虚函数结合使用,可以实现多态性。允许通过基类指针或引用操作派生类对象,从而实现不同的行为。
4.层次结构设计:
- 继承可以帮助建立清晰的类层次结构,反映现实世界的关系,使程序更易理解和维护。
5.接口一致性:
- 基类定义的接口可以被多个派生类共享,确保不同类之间的统一性和可互换性。
注意事项
-
1.菱形继承问题:
- 当一个类有多个基类时,可能导致继承链中的多个基类实例(菱形继承)。使用虚基类可以解决此问题。
class Base {
public:
void func() { /* ... */ }
};
class Derived1 : virtual public Base {};
class Derived2 : virtual public Base {};
class Final : public Derived1, public Derived2 {};
-
2.访问控制:
- 注意基类成员的访问控制。公有继承、保护继承和私有继承对派生类的访问权限影响不同,要谨慎选择。
+3. 构造函数和析构函数:
-
派生类构造函数会调用基类构造函数。确保在构造函数中正确初始化基类,必要时显式调用基类构造函数。
-
4.方法重写(Overriding):
- 在派生类中重写基类方法时,确保使用override关键字,以提高代码的可读性和安全性。如果基类方法不是虚拟的,派生类将无法重写。
+5. 设计原则:
-
在设计类之间的关系时,遵循“is-a”关系,即派生类应当是一种基类的特例,而不是“has-a”关系(组合关系)。
-
6.过度使用继承:
- 过度使用继承可能导致复杂的类结构和难以维护的代码。考虑使用组合(Composition)作为替代方案,在许多情况下,这更简单、更灵活。
-
7.内存管理:
- 在多重继承中,可能需要仔细管理内存分配和释放。尤其是带有虚函数的类,确保使用适当的资源管理策略。
原文地址:https://blog.csdn.net/2302_80908313/article/details/144301365
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!