与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++编程语言中,虚基类、虚函数与纯虚函数是面向对象编程中用于实现多态性的重要概念。本文将深入解析这三个概念,并通过示例代码来具体阐述其用法与作用。 ### 虚基类 虚基类(Virtual Base Class)是用来解决...
C++继承与派生类是面向对象编程的重要概念,它们允许我们创建新的类,这些类可以从现有的类(称为基类或父类)继承属性和行为。在这个实验中,我们将深入理解这两个概念,并通过实际编程练习来巩固它们。 一、继承...
例如,如果我们有一个基类`Animal`和两个派生类`Dog`和`Cat`,并且`Animal`有一个`makeSound()`虚函数,那么即使我们用`Animal`指针指向`Dog`或`Cat`对象,也能正确地调用到它们各自实现的`makeSound()`方法。...
虚基类与虚函数是C++中面向对象编程的关键特性,它们主要解决多继承带来的问题。在C++中,一个类可以作为多个派生类的基类,这可能导致同一个基类在派生类中出现多次,即所谓的"菱形继承"问题。为了解决这种情况下的...
C++基类与派生类的转换 在公用继承、私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中全部都按原样保留下来...
当派生类继承基类时,基类的私有成员在派生类中不可见,只能通过基类的成员函数访问;保护成员在派生类中可见,但不能直接访问,必须通过派生类的成员函数或者基类的成员函数来访问;而公有成员在派生类中依然保持...
4. 默认构造函数与带参数的构造函数:如果基类没有默认构造函数,而派生类的构造函数没有明确调用任何基类构造函数,编译器会报错。因此,必须确保基类有一个可访问的构造函数,以便派生类能够调用。 5. 继承的构造...
在面向对象编程(Object-Oriented Programming, OOP)中,基类与派生类是两个核心概念。基类(Base Class)也被称为父类或超类,它定义了一组通用的方法和属性,为其他类提供了共享行为的基础。派生类(Derived ...
当一个类被多个派生类继承,且这些派生类又有一个共同的基类时,如果直接或间接地多次继承了同一个基类,就会出现多继承问题,即"菱形问题"。虚基类的引入就是为了解决这个问题。通过声明基类为虚基类,所有的派生...
当一个基类指针或引用指向其派生类的对象时,通过虚函数调用,可以确保调用的是相应派生类的函数,而不是基类的函数。这被称为动态绑定或晚期绑定。虚函数在基类中声明,用`virtual`关键字标识,并在派生类中重定义...
当一个类从两个或更多具有共同基类的类继承时,如果没有使用虚基类,那么基类的实例会被每个派生类复制一次,可能导致数据冗余。通过声明基类为虚基类(using `virtual` 关键字),可以确保只有一个基类实例存在,...
多继承可以使得派生类继承多个基类的成员和行为特征,但也容易引发二义性问题。为了解决二义性问题,C++提供了虚基类的概念。虚基类是一种继承方式,它可以使得基类的成员在派生类中只出现一次。 在C++中,定义单...
需要注意的是,基类的构造函数和析构函数不能被派生类继承,派生类若要初始化基类的数据成员必须在构造函数中初始化。 类的成员可以分为 public (公有)、 protected (保护)和 private (私有)。基类成员访问...
### C++虚函数与虚函数表的理解 #### 一、虚函数的概念 在C++中,虚函数(Virtual Function)是一种特殊类型的成员函数,它允许基类指针或引用指向派生类对象,并通过该基类指针或引用调用派生类中重写的同名函数。...
- 当一个派生类继承自一个基类时,如果基类有虚函数表,那么派生类也会有一个虚函数表,该表中包含基类的虚函数和派生类自身定义的虚函数。 2. **多继承情况下:** - 当一个派生类多重继承多个基类时,如果这些...
C++中的继承是面向对象编程的核心特性之一,它允许创建一个新的类(派生类),该类继承自已存在的类(基类),并可以扩展或修改基类的功能。本题涉及了派生类和继承的多种概念,包括派生方式、成员访问、构造函数和...