这篇文章主要介绍“C++中的派生机制是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中的派生机制是什么”文章能帮助大家解决问题。
一、派生的类型
C++支持以下几种派生类型:
1.公有派生: 在公有派生中,派生类可以访问基类中的公有成员和受保护成员,但不能访问基类中的私有成员。公有派生通常用于向基类添加新的特征和行为。
示例代码如下:
class Base { public: int public_var; protected: int protected_var; private: int private_var; }; class Derived : public Base { public: void setVar(int a, int b, int c) { public_var = a; //公有成员可以在派生类中访问 protected_var = b; //受保护成员可以在派生类中访问 // private_var = c; //私有成员无法在派生类中访问 } };
2.保护派生: 在保护派生中,派生类可以访问基类中的公有成员和受保护成员,但不能访问基类中的私有成员。保护派生通常用于继承,即将基类的所有成员和方法都继承到派生类中。
示例代码如下:
class Base { public: int public_var; protected: int protected_var; private: int private_var; }; class Derived : protected Base { public: void setVar(int a, int b, int c) { public_var = a; //公有成员可以在派生类中访问 protected_var = b; //受保护成员可以在派生类中访问 // private_var = c; //私有成员无法在派生类中访问 } };
3.私有派生: 在私有派生中,派生类可以访问基类中的公有成员和受保护成员,但不能访问基类中的私有成员。私有派生通常用于“隐藏”继承,即对基类进行改进或扩展,但不公开基类的接口。
示例代码如下:
class Base { public: int public_var; protected: int protected_var; private: int private_var; }; class Derived : private Base { public: void setVar(int a, int b, int c) { public_var = a; //公有成员可以在派生类中访问 protected_var = b; //受保护成员可以在派生类中访问 // private_var = c; //私有成员无法在派生类中访问 } };
二、派生的语法
在C++中,派生的语法为:
class Derived_class : access_specifier Base_class { // 包含新成员和覆盖的函数等 };
其中,Derived_class 是基于 Base_class 的派生类。access_specifier 表示派生类型,可以是 public、protected 或 private。新的成员和覆盖的函数等是指在派生类中添加的成员和方法。
示例代码如下:
class Base { public: void print() { std::cout << "Base" << std::endl; } }; class Derived : public Base { public: void print() { std::cout << "Derived" << std::endl; } }; int main() { Base b; Derived d; b.print(); //输出 Base d.print(); //输出 Derived return 0; }
上述代码中,Base 类中定义了一个 print() 方法,输出 Base。Derived 类继承自 Base 类,并定义了一个同名的 print() 方法,输出 Derived。在 main 函数中,分别创建了 Base 类和 Derived 类的对象并分别调用了它们的 print() 方法。结果显示,派生类覆盖了其基类的同名方法。
三、多重继承
C++还支持多重继承,即一个派生类从多个基类派生而来。具体地,可以这样建立一个派生类:
class Derived : access_specifier Base1, access_specifier Base2, ... { // 包含新成员和覆盖的函数等 };
其中,Derived 是一个派生类,Base1、Base2 是两个基类,可以有多个基类。access_specifier 表示该基类在派生类中的访问权限,可以是 public、protected 或 private。
示例代码如下:
class Base1 { public: void print1() { std::cout << "Base1" << std::endl; } }; class Base2 { public: void print2() { std::cout << "Base2" << std::endl; } }; class Derived : public Base1, protected Base2 { public: void print() { print1(); //print2(); //private 成员不能在派生类之外的成员函数中访问 } }; int main() { Derived d; d.print(); return 0; }
上述代码中,定义了两个基类 Base1 和 Base2,分别有各自的方法 print1() 和 print2()。派生类 Derived 继承自 Base1 和 Base2,由于 Base2 的访问权限设置为 protected,在 Derived 中,只有成员函数可以访问 Base2 中的成员。Derived 中定义的 print() 方法分别调用了 Base1 和 Base2 中的方法,结果显示,多重继承能够在派生类中同时使用多个基类的成员,并进行灵活的访问权限设置。
四、虚继承
当一个类同时从多个基类继承,而这些基类中又有共同的基类时,就会出现“二义性”的问题。为了解决这个问题,C++引入了虚继承机制。
虚继承使用关键字 virtual,它告诉编译器,在继承链中只保留一份共同的基类,从而避免了多次继承造成的冗余。另外,虚继承还规定了一个虚基类列表。虚基类列表中的类在继承链中只继承一次,并且会在最深层的派生类中进行初始化。
示例代码如下:
class Root { public: int i; }; class A : public virtual Root { public: int j; }; class B : public virtual Root { public: int k; }; class C : public A, public B { public: void sum() { i = j + k; } }; int main() { C c; c.j = 10; c.k = 20; c.sum(); std::cout << "Sum of j and k is " << c.i << std::endl; return 0; }
上述代码中,定义了一个基类 Root,和两个继承了 Root 的派生类 A 和 B。类 C 同时从 A 和 B 继承,它将 A 和 B 中的 i 合并为一份,并且在最深层的派生类 C 中进行初始化。在 main 函数中,我们创建了类 C 的对象 c,并对它的成员变量 j 和 k 赋值,并通过 sum() 方法计算它们的和。
五、派生类和基类的关系
派生类和基类之间存在以下关系:
派生类包含的成员都是派生类自己定义的,但它可以访问基类的公有成员和受保护成员,也可以使用基类中的方法。
派生类的对象中包含了基类的对象,即派生类的对象中包含了基类对象的成员。
派生类的对象可以被看作是基类的对象,即派生类的对象可以直接赋值给基类对象。
示例代码如下:
class Base { public: int publicVar; protected: int protectedVar; private: int privateVar; public: void print() { std::cout << "publicVar: " << publicVar << std::endl; std::cout << "protectedVar: " << protectedVar << std::endl; std::cout << "privateVar: " << privateVar << std::endl; } }; class Derived : public Base { public: int additionalVar; public: void printAdditionalVar() { std::cout << "additionalVar: " << additionalVar << std::endl; } }; int main() { Derived derived; derived.publicVar = 1; //derived.protectedVar = 2; //protected 成员不能直接在类外部访问 derived.print(); //基类中的公有成员和受保护成员可以在派生类对象中访问 derived.additionalVar = 3; derived.printAdditionalVar(); //派生类中的成员可以直接访问 Base& base = derived; //派生类的对象可以赋值给基类对象 base.print(); //基类中的成员可以在基类对象中访问 return 0; }
上述代码中,定义了一个基类 Base 和一个派生类 Derived。在 main 函数中,我们首先创建了一个 Derived 的对象 derived,可以看到它可以访问由其基类 Base 中继承的成员变量和方法。同时,我们为 derived 对象中定义了一个 additionalVar 成员,并定义了一个打印 additionalVar 的方法。接着,我们将 derived 对象赋值给了一个 Base 类型的引用 base,并通过 base 访问了 Base 类中的成员变量和方法。结果显示了派生类和基类之间的关系。