虚基类,虚函数,纯虚函数,抽象类的区别与联系

本文详细介绍了虚基类的概念及其如何解决来自同一基类的同名成员引起的内存浪费问题,并阐述了虚函数和纯虚函数的作用及其实现多态的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虚基类,是继承中的一种机制。解决来自同一个基类的同名类成员浪费内存的问题。在虚基类的继承方式中不为虚基类成员另开辟空间。不是多态实现的机制。

虚函数,是基类中函数存在的方式。解决赋值兼容规则时,派生类对象代替基类对象时,基类指针可以访问派生类定义的基类的同名函数问题。实现派生类替代基类时,基类指针依然可以访问派生类中定义的和基类同名函数,实现函数多态。

纯虚函数:是不用给出函数实现的虚函数。用来实现派生类中对同一个基类的函数成员的不同实现。

抽象类:带有纯虚函数的类是抽象类。用于为一个类族建立一个公共接口。抽象类不能实例化。抽象类中的纯虚函数靠它的派生类实例化。

在C++中,定义一个拥有虚基类虚函数纯虚函数的类结构比较复杂,但可以这样设计: 首先创建一个虚基类 `VirtualBase` 两个派生类 `Derived1` `Derived2`,其中 `VirtualBase` 包含一个纯虚函数虚函数。 ```cpp // 虚基类 VirtualBase class VirtualBase { protected: virtual int getNumber() = 0; // 纯虚函数 public: virtual void displayInfo() { // 虚函数 cout << "Displaying from VirtualBase..." << endl; } }; // 派生类 Derived1 class Derived1 : public VirtualBase { private: int number; public: Derived1(int n) : number(n) {} ~Derived1() override {} // 析构函数 int getNumber() override { return number * 2; } // 实现纯虚函数 void displayInfo() override { VirtualBase::displayInfo(); cout << "From Derived1: " << number << endl; } }; // 派生类 Derived2 class Derived2 : public VirtualBase { private: int number; public: Derived2(int n) : number(n + 10) {} ~Derived2() override {} // 析构函数 int getNumber() override { return number / 2; } // 实现纯虚函数 void displayInfo() override { VirtualBase::displayInfo(); cout << "From Derived2: " << number << endl; } }; // 主函数部分 int main() { Derived1 obj1(15); Derived2 obj2(20); // 使用对象指针 VirtualBase* basePtr1 = &obj1; VirtualBase* basePtr2 = &obj2; // 通过基类指针调用虚函数 basePtr1->displayInfo(); basePtr1->getNumber(); basePtr2->displayInfo(); basePtr2->getNumber(); return 0; } ``` 在这个例子中,`Derived1` `Derived2` 都实现了 `VirtualBase` 的 `getNumber()` `displayInfo()` 函数,所以即使我们使用 `VirtualBase` 类型的指针指向 `Derived1` 或 `Derived2` 对象,也可以根据实际的对象类型调用相应的函数,这就是多态性的一个体现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值