单继承、多继承--问题解析

public、protected、private不仅是类中的访问限制符,在c++中“继承”中,它们还表示继承关系,public表示公有继承,protected表示受保护的,private表示私有的,如下图:

B类继承A类,我们称A类为基类(父类),称B类为派生类(子类),子类包括父类的成员变量和成员函数,三种继承关系基类成员在派生类中的访问关系变如下。

下面是以B继承A的详细代码:
//单继承    A->B
class A
{
public:
     void fun1()
     {
         cout << "A::fun1" << endl;
      }
      
private:
     int a;
};
 
class B : public A
{
public:
    void fun2()
    {
        cout << "B::fun2" << endl;
    }
 
private:
    int b;
};

程序运行后,调用内存会发现子类B中有父类中的成员变量与成员函数,设b是类B的对象,用sizeof(b)求得的大小为8。

说到“继承”就不免提到virtual这个关键字,对于成员函数的重写(覆盖),我们又应当怎样做呢?重写的概念是:当两个同名的函数(参数也相同)在不同的作用域中,这里指两个函数分别在父类和子类中,同时父类中的函数必须要求是虚函数,即就是在函数前面加上virtual的关键字,这就构成了虚函数的覆盖。

下面是虚函数覆盖:
class A
{
public:
    virtual void fun1()
    {
        cout << "A::fun1" << endl;
     }
     
private:
     int a;
};
 
class B : public A
{
public:
    void fun1()
    {
        cout << "B::fun1" << endl;
     }
 
private:
    int b;
};

既然有单继承就有多继承,多继承顾名思义就是子类有两个及两个以上的父类,即就是如下图所示:

下面是具体的程序示例:
class A
{
public:
     virtual void fun1()
    {
        cout << "A::fun1" << endl;
    }
    
private:
     int a;
};
 
class B 
{
public:
    virtual void fun1()
    {
        cout << "B::fun1" << endl;
    }
 
    void fun2()
    {
        cout << "B::fun2" << endl;
    }
 
private:
    int b;
};
 
class C : public A, public B
{
public:
    void fun2()
    {
        cout << "C::fun2" << endl;
    }
 
    void fun3()
    {
        cout << "C::fun3" << endl;
     }
 
private:
    int c;
};

根据上面的多重继承示例,计算类C的对象从c1的大小为20,因为类A中存在虚函数,编译会自动产生一个虚函数指针,占4个字节的大小,B类也是同样,所以c1的大小为20个字节。下面是监视c1的结果:

如若将类A和B中的virtual去掉,则sizeof(c1)的大小为12,因为不会产生虚函数指针,其中类C的fun2不会覆盖类B的fun2。

时间: 2024-10-05 22:03:12

单继承、多继承--问题解析的相关文章

网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档

小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心:通过该项目,我们对业务流程有一个整体把控.对继承和多态有深入的了解 下面是类图: 主界面图: 核心思路: 1   1.首先在频道管理类ChannelManager中写一个加载所有频道方法LoadAllChannel; 2   3        该方法作用读取FullChannels.xml文件,并且

C++中的类继承之单继承&amp;多继承&amp;菱形继承

 C++中的类继承之单继承&多继承&菱形继承 单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承.这种关系比较简单是一对一的关系: 多继承是指 一个子类有两个或以上直接父类时称这个继承关系为多继承.这种继承方式使一个子类可以继承多个父类的特性.多继承可以看作是单继承的扩展.派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承.多继承下派生类的构造函数与单继承下派生类构造函数相似,它必须同时负责该派生类所有基类构造函数的调用.同时,派生类的参数个数必须包

JAVA笔记5__构造块、静态块/单例设计模式/继承/final关键字/super关键字

public class Main { { //构造块(在构造对象时调用,先于构造方法执行) System.out.println("我是构造块!"); } static{ //静态块(在类加载时执行,且只执行一次[在构造块前执行]eg:数据库连接) System.out.println("我是静态块!"); } public Main(){ System.out.println("我是构造方法!"); } public static void

继承,多继承,单继承

继承子类以及子类实例化的对象可以父类的任何方法或变量类名可以访问父类所有内容 class Animal: def __init__(self,name,sex,age): self.name=name self.sex=sex self.age=age def eat(self,a1): print('%s吃%s' % (self.name,a1)) def drink(self): print('%s喝东西' %(self.name)) class Cat(Animal): def miaow

万能的函数 之 接口继承 实现继承~~~

在public继承中,(public 继承表示的关系是 "is  a " 的关系),其类中定义的函数主要有三类:pure virtual函数,impure virtual函数以及non-virtual函数,这三种函数决定了public继承中的两个重要概念 : " 函数接口继承" 以及 "函数实现继承".那么接下来将针对这样一个不简单的问题做一些简介. 考虑如下的类定义: class Shape{ public: virtual void show

sizeof 和类继承 虚继承 求类大小

代码: #include <iostream> using namespace std; /* class a{ float k; // 4字节 virtual void foo(){} //有一个4字节的指针指向自己的虚函数表 }; class b : virtual public a{ virtual void f(){} }; 有这样的一个指针vptr_b_a,这个指针叫虚类指针,也是四个字节:还要包括类a的字节数,所以类b的字节数就求出来了. 运行结果: 8 16 */ /* clas

javascript模拟实现继承,继承一次父类模板和原型对象

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getS

web前端开发必懂之一:JS继承和继承基础总结

首先,推荐一篇博客豪情的博客JS提高篇: http://www.cnblogs.com/jikey/p/3604459.html ,里面的链接全是精华, 一般人我不告诉他; 我们会先从JS的基本的设计模式开始,由浅入深: 工厂模式:因为使用用一个接口创建很多对象会产生大量的重复代码,为了解决这个问题,人们就开始使用工厂模式: <!DOCTYPE html> <html> <head> <title></title> <meta charse

C#面向对象(OOP)入门—第二天—多态和继承(继承)

介绍: 第一天的内容主要是不同情形下的方法重载.这一部分则主要讲面向对象中继承的概念.首先用一个要点图形来定义继承. 继承 一个简单的例子: ClassA: class ClassA:ClassB { public void Display1() { Console.WriteLine("ClassA Display1"); base.Display1(); } } ClassB: class ClassB { public int x = 100; public void Displ

c++继承详解:共有(public)继承,私有继承(private)继承,保护(protected)继承

公有继承(public)继承.私有继承(private).保护继承(protected)是常用的三种继承方式. 1.公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问. 2.私有继承(private) 私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问. 3.保护继承 保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,