定义基类和派生类

定义基类

对于基类,我们需要记住的是作为继承关系中根节点的类通常都会定义一个虚析构函数。

基类通常都会定义一个虚析构函数,即使该函数不执行任何实际操作也是如此。

 

成员函数和继承

派生类可以继承其基类的成员,也可以对基类中的虚函数进行重新定义。换句话说,派生类需要对这些操作提供自己的新定义以覆盖(override)从基类继承而来的旧定义。

在C++语言中,基类必须将它的两种成员函数区分开来:一种是基类希望其派生类进行覆盖的函数;另一种是基类希望派生类直接继承而不要改变的函数。对于前者,基类通过将其定义为虚函数(virtual)。当我们使用指针或引用调用虚函数时,该调用将被动态绑定。根据引用或指针所绑定的对象类型不同,该调用可能执行基类的版本,也可能执行某个派生类的版本。

基类通过在其成员函数的声明语句之前加上关键字virtual使得该函数执行动态绑定。任何构造函数之外的非静态函数都可以是虚函数。关键字virtual只能出现在类内部的声明语句之前而不能用于类外部的函数定义。如果基类把一个函数声明成虚函数,则该函数在派生类中隐式地也是虚函数。

成员函数如果没有被声明为虚函数,则其解析过程发生在编译时而非运行时。

 

访问控制与继承

派生类可以继承定义在基类中的成员,但是派生类的成员函数不一定有权访问从基类继承而来的成员。和其他基类的代码一样,派生类能访问公用成员,而不能访问私有成员。不过在某些时候基类中还有这样一种成员,基类希望它的派生类有权访问该成员,同时禁止其他用户访问。我们用受保护的(protected)访问运算符说明这样的成员。

 

定义派生类

时间: 2024-10-31 10:34:40

定义基类和派生类的相关文章

详解C++中基类与派生类的转换以及虚基类_C 语言

C++基类与派生类的转换 在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中全部都按原样保留下来了,在派生类外可以调用基类的公用成员函数访问基类的私有成员.因此,公用派生类具有基类的全部功能,所有基类能够实现的功能, 公用派生类都能实现.而非公用派生类(私有或保护派生类)不能实现基类的全部功能(例如在派生类外不能调用基类的公用成员函数访问基类的私有成员).因此,只有公用派生类才是基类真正的

c++中基类与派生类中隐含的this指针的分析

先不要看结果,看一下你是否真正了解了this指针? #include<iostream> using namespace std; class Parent{ public: int x; Parent *p; public: Parent(){} Parent(int x){ this->x=x; p=this; } virtual void f(){ cout<<"Parent::f()"<<endl; } void g(){ cout&l

对象-C++多态基类和派生类之间转换

问题描述 C++多态基类和派生类之间转换 #include <iostream> #include<iostream> using namespace std; class A { public: void foo() { printf("1 "); } virtual void fun() { printf("2 "); } }; class B : public A { public: void foo() { printf("

消息印射-两个MFC类实现多重继承,虚继承基类时候派生类的消息映射出错,求解决方法

问题描述 两个MFC类实现多重继承,虚继承基类时候派生类的消息映射出错,求解决方法 一个类实现了可悬浮侧靠的对话框,另一个类实现了有滑动条的对话框,然后我就想到了多重继承来实现一个可悬靠带滑动条的对话框.由于看书上说要虚继承基类,并且在初始化成员类表中显示初始化基类,这些都有做,但是在消息印射部分出了问题. 这里编辑代码不方便,详细情况在帖子中 http://bbs.csdn.net/topics/390871222 不胜感激

详谈C++中虚基类在派生类中的内存布局_C 语言

今天重温C++的知识,当看到虚基类这点的时候,那时候也没有太过追究,就是知道虚基类是消除了类继承之间的二义性问题而已,可是很是好奇,它是怎么消除的,内存布局是怎么分配的呢?于是就深入研究了一下,具体的原理如下所示: 在C++中,obj是一个类的对象,p是指向obj的指针,该类里面有个数据成员mem,请问obj.mem和p->mem在实现和效率上有什么不同. 答案是:只有一种情况下才有重大差异,该情况必须满足以下3个条件: (1).obj 是一个虚拟继承的派生类的对象 (2).mem是从虚拟基类派

C++中基类和派生类之间的转换实例教程_C 语言

本文实例讲解了C++中基类和派生类之间的转换.对于深入理解C++面向对象程序设计有一定的帮助作用.此处需要注意:本文实例讲解内容的前提是派生类继承基类的方式是公有继承,关键字public.具体分析如下: 以下程序为讲解示例: #include<iostream> using namespace std; class A { public: A(int m1, int n1):m(m1), n(n1){} void display(); private: int m; int n; }; voi

【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器

类模板 类模板多个类型默认类型简单数组模板 #pragma once template <class T=int>//类模板可以有一个默认的值 class myArray { public: myArray(); ~myArray(); }; #include "myArray.h" template <class T=int>//每一个函数都需要加上一个默认的值 myArray<T>::myArray() //类模板成员函数在外部,需要加载类型初始

派生类与派生类对象对基类成员的访问

区分"派生类对象"和"派生类"对基类成员的访问权限.    "派生类对象"对基类成员的访问权限:      (1)对于公有继承,只有基类的公有成员可以被"派生类对象"访问,其他(保护和私有)成员不能被访问.      (2)对于私有继承和保护继承,基类中所有成员都不能被"派生类对象"访问.    "派生类"对基类中成员的访问权限:     (1)对于公有继承,基类中的公有成员和保护成

《Inside the C++ Object Model》关于基类与派生类的Tips

近来阅读<Inside the C++ Object Model>,里边讲到,在C++中多态只存于public class体系中,且只有通过pointer和reference来间接处理. #include <iostream> using std::cout; using std::endl; class Base { public: virtual void printf(void) { cout<< "Base printf"<< e