欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c++ 基类派生类 继承与虚函数

程序员文章站 2024-01-25 18:51:40
...

与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;
}

 

运行的结果正如我想的那样:

 

当前房间的名字是:职员办公室
当前房间的名字是:老板办公室
当前房间的名字是:我是一个工厂