我是不是将基类与超类一起继承以进行多重继承?
Posted
技术标签:
【中文标题】我是不是将基类与超类一起继承以进行多重继承?【英文标题】:Am I inherting base class along with superclass for multiple inheritance?我是否将基类与超类一起继承以进行多重继承? 【发布时间】:2014-08-02 02:54:49 【问题描述】:因此,我试图围绕 C++ 中的多重继承这一想法展开思考。在过去的几个小时里,我一直在做一些家庭作业,但遇到了障碍,这与MI
有关。所以我有一个东西继承自的Package
类。 Letter
Box
Crate
Crate 可以选择 MetalCrate
或 WoodCrate
我的问题是:What is needed inside of the Crate class?
crate.h
#ifndef CRATE_H
#define CRATE_H
#include "package.h"
class Crate: public Package
public:
Crate();
Crate(double price, int weight, int trackingNumber);
double cost();
;
#endif
成本是包中的一个虚函数,所有类都有自己的实现。 I shouldn't have to define all the public variables that I defined inside of Package inside the Crate class
对吗?我一直在网上阅读资料,但似乎无法理解 Crate 类中需要什么。
Package.h
class Package
protected:
double price;
int weight;
int trackingNumber;
public:
Package();
Package(double price, int weight, int trackingNumber);
void setWeight(int weight);
void setPrice(int price);
void setTrack(int track);
double getPrice();
int getWeight();
int getTrack();
virtual double cost() = 0;
~Package();
;
MetalCrate.h
class MetalCrate: public Crate, public Package
public:
MetalCrate();
MetalCrate(double price, int weight, int trackingNumber);
double cost();
;
这就是我的课程的样子。请帮忙,提前谢谢。
metalcrate.h:16:7: warning: direct base ‘Package’ inaccessible in ‘MetalCrate’ due to ambiguity [enabled by default] class MetalCrate: public Crate, public virtual Package this is the error i get when i try to compile. i'm trying to get my wood/metal crate to inherit from crate and package –
讨论转移到了一个更详细地解释事情的聊天
【问题讨论】:
使用 C++ 多重继承的最好方法是完全避免它 另外,你能把你的问题说得更清楚一点吗?我很乐意回答,但我不确定你到底在问什么。 多重继承在哪里?Crate
只有一个父类。
@Pradhan 哎呀我忘了添加我的金属箱类。实际上我什至不确定如何正确设置金属板条箱类
让我们continue this discussion in chat.
【参考方案1】:
有不同的方式来构建代码,但就面向对象的设计而言,通常最好不要在基类中包含任何状态或实现,而只在最终的具体类中包含状态和实现。一个原因是,经常会遇到这样一种情况,即实现与基类所考虑的实现集大不相同,因此基类使用的存储变得不适合特定实现。另一个原因是,在基类中提供实现可能会对实现施加额外的不变量和约束,而这些实现可能不知道或很容易被破坏。
简而言之,一种更好的结构方式是:
class Package
public:
virtual ~Package();
virtual double getPrice() const = 0;
virtual int getWeight() const = 0;
virtual int getTrack() const = 0;
virtual double cost() const = 0;
protected:
Package();
;
然后,创建一个单独的类,封装公共元素(或创建一个“AbstractPackage”,其他包实例可以选择继承)。这使您可以创建一个 Package 的实现,如果它不适用于某些替代实现,它不会携带默认实现/变量的额外包袱。此外,即使对于您的“AbstractPackage”,您也不应该将变量设置为“protected”或“public”;所有成员变量都应该是“私有的”(如果您的派生类需要访问,请考虑使用“受保护”访问器)。
【讨论】:
那么我应该使用子类中的设置器,比如字母或框来设置重量和价格等吗? 那或使用“AbstractPackage”的基本构造函数。您还应该考虑在构造后这些值是否需要可变;在可能的情况下,在构造时提供此类配置通常会更好/更干净,然后在成功创建对象后使状态不可变,尽管这实际上取决于有关您的使用/应用程序的更多细节。以上是关于我是不是将基类与超类一起继承以进行多重继承?的主要内容,如果未能解决你的问题,请参考以下文章