与java相比,c++的继承个人觉得有点复杂,复杂在构造函数上,java中派生类实现基类的构造函数直接super关键字,就可以实现,c++中则要通过实现构造函数,看下面的例子
特别说明的是:基类的希望派生类实现的函数一定要用virtual 标明为虚函数,虚函数是c++实现动态绑定的关键,基类的虚函数,基类一定要实现,不然则会编译不通过,派生类可以不实现虚函数而用基类的函数执行。
纯虚函数:
virtual void setRoomName()=0;
如果一个类的函数全部都是纯虚函数,则这个类不能有自己类的实现(包括引用和指针),只能通过派生类继承实现(这点和java的接口类似)
首先基类的实现:
基类Room的头文件代码
#pragma once
#include <string>
#include <iostream>
using std::string;
class Room
{
public:
Room(string roomName);
~Room();
private:
string name;
public:
virtual void setRoomName();
};
基类Room的源文件文件代码
#include "stdafx.h"
#include "Room.h"
Room::Room(string roomName) :name(roomName)
{
}
Room::~Room()
{
}
void Room::setRoomName(){
std::cout << "当前房间的名字是:"<<name << std::endl;
}
一下三个派生类
第一个派生类Boss的头文件
#pragma once
#include "Room.h"
class Boss :
public Room
{
public:
Boss(string roomName);
~Boss();
virtual void setRoomName() override;
};
第一个派生类Boss的源文件
#include "stdafx.h"
#include "Boss.h"
#include <iostream>
using std::cout;
using std::endl;
Boss::Boss(string roomName) :Room(roomName)
{
}
Boss::~Boss()
{
}
void Boss::setRoomName(){
cout << "当前房间的名字是:老板办公室"<<endl;
}
第二个派生类Office的头文件
#pragma once
#include "Room.h"
class oofice:public Room
{
public:
oofice(string roomName);
~oofice();
virtual void setRoomName() override;
};
第二个派生类Office的源文件
#include "stdafx.h"
#include "Office.h"
#include <iostream>
using std::cout;
using std::endl;
oofice::oofice(string roomName) :Room(roomName)
{
}
oofice::~oofice()
{
}
void oofice::setRoomName(){
cout << "当前房间的名字是:职员办公室" << endl;
}
第三个派生类Factory的头文件
#include "stdafx.h"
#include "Factory.h"
Factory::Factory(string roomName) :Room(roomName)
{
}
Factory::~Factory()
{
}
第三个派生类Factory的源文件
#include "stdafx.h"
#include "Factory.h"
Factory::Factory(string roomName) :Room(roomName)
{
}
Factory::~Factory()
{
}
测试代码:
int _tmain(int argc, _TCHAR* argv[])
{
Room *room = new oofice("");
room->setRoomName();
room = new Boss("jkl");
room->setRoomName();
room = new Factory("我是一个工厂");
room->setRoomName();
system("pause");
return 0;
}
运行的结果正如我想的那样:
当前房间的名字是:职员办公室
当前房间的名字是:老板办公室
当前房间的名字是:我是一个工厂
相关推荐
在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数。下面就是一个例子:
从bicycle和motorcar派生出motorcycle,观察虚基类对继承的影响。 定义一个motorcycle的对象,分别调用run()和stop(),观察构造/析构函数的调用情况。 注意:构造函数和析构函数中均为cout语句,说明哪个构造/析构...
C++基类与派生类的转换 在公用继承、私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中全部都按原样保留下来...
含有虚基类的派生类的构造函数有什么要求,什么是最远派生类,建立一个含有虚基类的派生类的对象时,为什么由最远派生类的构造函数负责虚基类的初始化?继承与组合之间的区别与联系是什么?派生类的构造函数是怎样的...
虚基类与虚函数 虚基类的概念 在C++语言中,一个类不能被多次说明为一个派生类的直接基类,但可以不止一次地成为间接基类。这就导致了一些问题。为了方便 说明,先介绍多继承的“类格”表示法。
多继承 基类 派生类(还要有多个父类) 第二条:涉及构造和析构 通过实例化一个对象体现构造和析构 还要有函数重载 第三个:基类 派生类的关系 以及如何访问抽象类 纯虚函数 还应包含有对象成员(除了一般成员外) -----...
4、声明二维坐标类作为基类派生出圆类, 把圆类作为基类,派生圆柱体类。 其中,基类二维坐标类有成员数据:x、y坐标值;有成员函数:构造函数实现对基类成员数据的初始化、输出的成员函数,要求输出坐标位置。 派生...
今天重温C++的知识,当看到虚基类这点的时候,那时候也没有太过追究,就是知道虚基类是消除了类继承之间的二义性问题而已,可是很是好奇,它是怎么消除的,内存布局是怎么分配的呢?于是就深入研究了一下,具体的...
定义一个Person 类,...Person 类以Public方式派生出一个Teacher类,数据成员包括:int gh(工号);char* title(职称),为该类添加输入输出流运算符重载,完成有参、无参、拷贝构造函数的定义,在主函数测试Teacher类
定义为virtual的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。 二、作用虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在...
多态性(在C + +中用虚函数实现)是面向对象程序设计语言继数据...虚函数反映了一个类型与另一个类似类型之间的区别,只要这两个类型都是从同一个基类派生的。这种区别是通过其在基类中调用的函数的表现不同来反映的。
在C++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。 继承的三种控制形式; public 表示公有基类; 公有继承的特点是基类的...
当使用指针或对基类的引用来引用派生的类对象时,可以为该对象调用虚函数并执行该函数的派生类版本。 虚函数确保为该对象调用正确的函数,这与用于进行函数调用的表达式无关。 假定基类包含声明为 virtual 的函数,...
2.用基类类型指针绑定派生类实例,析构的时候,如果基类析构函数不是虚函数,则只会析构基类,不会析构派生类对象,从而造成内存泄漏。 ●C++默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,...
2:正确定义派生类的构造函数与析构函数,理解定义一个派生类对象时构造函数、析构函数的调用次序。 3:理解同名冲突的产生原因,会使用虚基类来解决第三类同名冲突问题,并理解引入虚基类后构造函数、析构函数的...
当编译器发现基类当中有虚函数存在时,就会为每个含有虚函数的类创建一个虚函数表(vtable),该表是一个一维数组,存放的是虚函数的地址,子类中如果没有虚函数也会从基类中继承虚函数表,虚表创建之后还会创建一个...
多继承下的派生类构造函数必须同时负责该派生类的所有基类构造函数的参数传递。且构造函数和析构函数的调用顺序和单继承是一样的,先调用基类构造函数,再调用对象成员的构造函数,最后调用派生类的构造函数。那么...
虚函数是在基类中声明为虚函数的函数,允许派生类重写该函数以实现特定的行为。通过基类指针或引用调用虚函数时,会根据指向的对象的实际类型来确定调用哪个版本的函数,这就是多态性的实现。 系统需实现以下功
其中研究生类从学生类继承过来,分别采用公有继承与私有继承、保护继承三种方式,程序中包括输入数据的函数,运行时输入其5项的值,程序应输出5个数据值。 答案:略 2、(1) 声明一个基类Animal,有私有整型成员...
3.4 C++类的构造函数与析构函数 39 3.5 对象数组 47 3.6 this指针 50 3.7 static静态成员变量 52 3.8 static静态成员函数 53 3.9 const成员变量和成员函数 55 3.10 const对象(常对象) 56 3.11 友元函数和友元类 58 ...