C++之菱形继承与虚继承(含虚函数)

本文深入探讨了C++中的菱形继承问题,解释了如何通过虚继承来解决多重继承导致的问题。内容包括虚继承的概念、作用,以及虚函数在菱形继承中的应用。读者将了解到如何正确地使用虚继承以避免重复的基类子对象,并理解虚继承在多态中的关键作用。
摘要由CSDN通过智能技术生成
面向对象的三大特征: 封装,多态,继承
前面我们已经讲了继承的一些知识点,在这基础上,我们讲的时候再涉猎一些多态的只是。
下面我们先接着上次讲有虚函数的菱形虚继承
首先什么是虚函数。?
虚函数:在类里面,函数前面有virtual关键字的成员函数就是虚函数。
代码块:
class base
{
public:
 base()
 {
  cout << "base()" << endl;
 }
 ~base()
 {
  cout << "~base()" << endl;
 }
 virtual void dis()//加了关键字virtual,dis就成了虚函数
 {
  cout << "pub=" << pub;
  cout << "     pro=" << pro;
  cout << "     pri=" << pri << endl;
 }
 int pub;
protected:
 int pro;
private:
 int pri;
};

我们先讲几个知识点:
1.虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。
2.在一个类中, 成员函数有虚函数的话,那么,这个对象的前四个字节一定是存放一个指向这个虚函数表(简称虚表)    的指针。虚表里面放的是虚函数的地址
3.对于菱形继承这样,有 多个基类的类对象,则会有多个虚表,每一个基类对应一个虚表,同时,虚表的顺序和继承时的顺序相同。
4.即使是存在虚基类指针, 虚表指针也是在虚基类指针的上方,这是为了保证正确取到虚函数的偏移量。
举个简单的例子
代码块:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<stdio.h>
using namespace std;
class base
{
public:
 base(int a=1,int b=2,int c=3)
  : pub(a)
  , pro(b)
  , pri(c)
 {
  cout << "base()" << endl << endl;
 }
 ~base()
 {
  cout << "~base()" << endl << endl;
 }
 virtual void dis()//加了关键字virtual,dis就成了虚函数
 {
  cout << "dis()" << endl<<endl;
  cout << "pub=" << pub;
  cout << "     pro=" << pro;
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值