C++类继承与多态性实验分析

版权申诉
5星 · 超过95%的资源 0 下载量 29 浏览量 更新于2024-10-04 收藏 790KB ZIP 举报
资源摘要信息: "本资源详细介绍了面向对象编程中基类与派生类的概念,以及如何通过一个具体实例——BaseClass和DerivedClass来演示方法重载和多态的应用。" 面向对象编程(OOP)是当前主流的编程范式之一,其核心概念包括类(Class)、对象(Object)、继承(Inheritance)、封装(Encapsulation)、多态(Polymorphism)和抽象(Abstraction)。其中,继承是面向对象编程的基石之一,它允许创建新类(称为派生类)来继承现有类(称为基类)的属性和方法。本例中涉及的“基类BaseClass派生出类DerivedClass”演示了继承的基本用法。 基类(BaseClass)是在面向对象程序设计中定义一类对象共性的模板,包含了该类所有对象共有的属性和方法。在本例中,BaseClass拥有的成员函数fn1()和fn2()是该基类的特征。 派生类(DerivedClass)是通过继承一个已存在的基类而创建的新类,它继承了基类的所有成员变量和成员函数。在本例中,DerivedClass是从BaseClass派生出的,这意味着DerivedClass继承了BaseClass的成员函数fn1()和fn2()。 方法重载(Method Overloading)是多态的一种表现形式,指的是在同一个类中可以存在多个同名函数,但这些函数的参数类型、个数或顺序至少有一个不同。在本例中,DerivedClass重载了BaseClass的成员函数fn1()和fn2(),这允许DerivedClass对象使用自己的方法实现。 多态(Polymorphism)是指允许不同类的对象对同一消息做出响应的能力,即同一操作作用于不同的对象时,可以有不同的解释和不同的执行结果。在本例中,我们可以通过基类指针调用派生类的函数,来观察运行时的多态行为。 在主函数中,通过声明一个DerivedClass对象,以及使用BaseClass和DerivedClass的指针调用fn1()和fn2()函数,可以观察到以下运行结果: 1. 当通过DerivedClass对象直接调用fn1()和fn2()时,将执行DerivedClass中重载的方法。 2. 当通过BaseClass指针调用fn1()和fn2()时,将根据指针所指向的对象的实际类型(即BaseClass或DerivedClass)动态决定调用哪个类的函数,这体现了运行时多态。如果指针指向的是BaseClass对象,则调用BaseClass中的方法;如果指针指向的是DerivedClass对象,则调用DerivedClass中重载的方法。 3. 当通过DerivedClass指针调用fn1()和fn2()时,将执行DerivedClass中重载的方法。 通过这个实例,我们可以了解到在面向对象编程中,类的继承关系、方法的重载和多态性如何影响函数调用和对象行为。这是学习面向对象编程和深入理解C++等支持面向对象特性的编程语言时的重要知识点。 在实际编程中,合理地运用继承和多态机制,可以增强代码的模块化、可复用性和可扩展性,有助于构建更加灵活和健壮的软件系统。

CGroupInfo::CGroupInfo(shared_ptr<Graph> g){ m_groupSize.clear(); m_groupMembers.clear(); m_groupMembersSize.clear(); m_groupMembersInpSize.clear(); printf("CG0 \n"); for (auto it = g->begin(); it != g->end(); ++it) { printf("CG1 \n"); Node *n = *it; if(kConcat == n->kind()) { printf("CG2 \n"); string groupname = n->output()->uniqueName(); //Value's uniqueName is unique, so can be used as key printf("groupname = %s\n", groupname); m_groupSize[groupname] = getValueSize(n->output()); for(int i = 0; i < n->inputs().size(); i++) { printf("CG3 \n"); Node *inp = n->inputs()[i]->node(); if(n->inputs()[i]->node()->kind() == kParam) { printf("CG4 \n"); continue; } m_groupMembers[groupname].push_back(n->inputs()[i]->uniqueName()); m_groupMembersSize[groupname].push_back(getValueSize(n->inputs()[i])); m_groupMembersInpSize[inp->inputs()[0]->uniqueName()] = getValueSize(inp->inputs()[0]); } } else if(n->inputs().size() > 0 && isGraphInput(g,n)) { printf("CG5 \n"); m_groupSize["group_input"] += getValueSize(n->inputs()[0]); m_groupMembers["group_input"].push_back(n->inputs()[0]->uniqueName()); m_groupMembersSize["group_input"].push_back(getValueSize(n->inputs()[0])); } else if(kTransLayoutAfterSlice == n->kind()) { printf("CG6 \n"); string groupname = n->output()->uniqueName(); //Value's uniqueName is unique, so can be used as key m_groupSize[groupname] = getValueSize(n->output()); for(int i = 0; i < n->inputs().size(); i++) { printf("CG7 \n"); Node *inp = n->inputs()[i]->node(); m_groupMembers[groupname].push_back(n->inputs()[i]->uniqueName()); m_groupMembersSize[groupname].push_back(getValueSize(n->inputs()[i])); m_groupMembersInpSize[inp->inputs()[0]->uniqueName()] = getValueSize(inp->inputs()[0]); } } } }这段是什么意思

2023-06-09 上传