C++多重继承带来的问题

首先上图,咱们看图说话!

橙色表示变量,使用private修饰。

如图,假设Person类的变量name只能通过input方法来输入。

那么继承自Person的Student及Teacher类中s_input、t_input函数都将通过调用Person中的p_input方法来实现name变量的输入。

此时通过virtual继承方式,StuTeach类中只有Person的一份拷贝。

那么在StuTeach的类中的input方法,我们需要分别调用Student及Teacher的类中s_input、t_input来实现num及subject等变量的输入。显然此时Person类中的input方法被执行了两次。

 

那么我们接下来想一下是什么地方设计的不合理或者不符合逻辑?

在Student类中需要输入其父类的变量,我们显然想到且只能调用input方法来改变其中的private修饰的变量。

Teacher类同理,此时貌似唯一的解决方案就是将Person类中的name修改为用protected修饰,然后在StuTeach中直接修改其变量,此时StuTeach需要知道其根父类Person的内容。

另外一种方法,针对变量加入set/get方法,这个时候依然需要StuTeach类了解根父类Person的内容方可达到。

因为都需要通过根父类来操作根父类的变量,所以这两种方法,我认为没有本质上的区别。

那么我们是否有其他方式来解决多重继承带来的根父类数据的迷之操作困难?

目前我尚未有答案。

时间: 2024-07-30 16:59:19

C++多重继承带来的问题的相关文章

C++之多重继承

大多数应用程序使用单个基类的公用继承,但是在某些情况下,单继承是不够的,必须使用多继承.C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承. 举个例子,交通工具类可以派生出汽车和船连个子类,但拥有汽车和船共同特性水陆两用汽车就必须继承来自汽车类与船类的共同属性.如下图示: 代码实现: //多重继承 #include <iostream> using namespace std; class Vehicle { public: Vehicle(int weight = 0) { V

C++多重继承的指针问题

下面说说C++多重继承中关于指针的一些问题. 指针指向问题 先看下面的程序: class Base1 { public: virtual void fun1() {cout << "Base1::fun1" << endl;}; }; class Base2 { public: virtual void fun2() {cout << "Base2::fun1" << endl;}; }; class Derive :

多重继承下的类型转换

主要解释强制类型转换的影响.因为static_cast会在编译期间检测,dynamice_cast会在运行时检测. #include <iostream> #include <hash_map> using namespace std; class I1 { public: virtual void vf1() { cout << "I'm I1:vf1()" << endl; } }; class I2 { public: virtua

面向对象程序设计及语言

面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术到一定阶段后的产物.如今,面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围.如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构,CAD技术.人工智能等领域. 面向对象语言借鉴了20世纪50年代的人工智能语言LISP,引入动态绑定的概念和交互式开发环境的思想.始于20世纪60年代的离散事件模拟语言SIMULA67,引入了类的要领和继承,成型于20世纪70年代的Smalltalk. 面向对象语言发展的两个方

黑马程序员-Java面向对象下《二》

                         ------- android培训.java培训.期待与您交流! ---------- 1.继承的概念 面向对象的特点之一,可以实现对类的复用.可以通过以下两种方法实现 a.合成/聚合关系(包含其他类):将一个类当作另一个类的属性. b.派生类:一个类继承另一个类,实现继承的类称为派生类,被继承类称为父类,基类,超类. 父类的成员方法和成员变量被子类继承,但是父类的构造方法没有被继承. 在Java中只支持单继承,和C++多继承不一样. 2.sup

Java-面向对象篇下《二》

1.继承的概念 面向对象的特点之一,可以实现对类的复用.可以通过以下两种方法实现 a.合成/聚合关系(包含其他类):将一个类当作另一个类的属性. b.派生类:一个类继承另一个类,实现继承的类称为派生类,被继承类称为父类,基类,超类. 父类的成员方法和成员变量被子类继承,但是父类的构造方法没有被继承. 在Java中只支持单继承,和C++多继承不一样. 2.super关键字 1.super可以访问父类的成员变量 2.super可以调用父类的成员方法 3.super可以在子类构造方法里调用父类的构造方

C++003基础

1.C++对C的扩展 1简单的C++程序 1.1求圆的周长和面积 数据描写叙述: 半径.周长,面积均用实型数表示 数据处理: 输入半径 r. 计算周长 = 2*π*r : 计算面积 = π* r2 . 输出半径,周长,面积: 方法1:用结构化方法编程,求圆的周长和面积 // count the girth and area of circle #include<iostream.h> using name std; void main () { double r, girth, area ;

java接口和包

一. API 包.接口.异常处理的作用 包是类和接口的集合.利用包可以把常用的类或功能相似的类放在一个包中.Java 语言提供系统包,其中包含了大量的类,可以在编写Java 程序时直接引用它们.为便于管理和使用它们,将这些类分为了不同的包.包又称类库或API 包,所谓API(Application Program Interface)即应用程序接口.API 包—方面提供丰富的类与方法供大家使用,如画图形.播放声音等,另一方面又负责和系统软硬件打交道,圆满实现用户程序的功能.所有Java API

C++ 抽象类二(抽象类的基本语法)

//抽象类的基本语法 #include<iostream> using namespace std; /* 有关多继承的说明 被实际开发经验抛弃的多继承 工程开发中真正意义上的多继承是几乎不被使用的 多重继承带来的代码复杂性远多于其带来的便利 多重继承对代码维护性上的影响是灾难性的 在设计方法上,任何多继承都可以用单继承代替 绝大多数面向对象语言都不支持多继承 绝大多数面向对象语言都支持接口的概念 C++中没有接口的概念 C++中可以使用纯虚函数实现接口 接口类中只有函数原型定义,没有任何数据