C++ 包含两个派生自同一个基类的类

Posted

技术标签:

【中文标题】C++ 包含两个派生自同一个基类的类【英文标题】:C++ Include two classes that derive from the same base class 【发布时间】:2013-10-10 03:34:26 【问题描述】:

我有一个基类Base。 从它派生的两个类:DerivedADerivedB。在这两个类的标题中,我都包含了Base.h。 然后,在我定义我的mainsource.cpp 中,如果我只包含DerivedA.h,它工作正常。如果我只包含DerivedB.h 它也可以正常工作。问题是我不能同时包含两者。 每当我同时包含两者时,编译器都会生成一堆错误,例如

“.debit”左侧必须有类/结构/联合 'getBalance' : 不是'CheckingAccount' 的成员

我想问题是当我包含两个标题时,Base.h 被包含两次。我应该如何包含这些标题?

【问题讨论】:

【参考方案1】:

如果问题只是头文件而不是deadly diamond of death 的情况,您可以在头文件中使用#pragma once,这样可以确保它在构建过程中只链接一次。

或者,你可以将你的头文件包装成这样:

#ifndef HEADER_H_
#define HEADER_H_

// The content of the header file goes here...

#endif

通过使用预处理器#ifXXXX 语句,您可以告诉编译器仅在尚未预定义宏时才包含文件。

【讨论】:

注意: #pragma once 被很多编译器支持,但它不是标准的 C++。替代版本(“包括守卫”)适用于每个 C++ 编译器。 您的意思是“您可以告诉编译器仅在宏已预定义时才包含文件”? 另请注意:#pragma once 比在大型项目中包含守卫要快得多 感谢您的回答。您如何看待我刚刚提出的另一种解决方案:将 DerivedA.h 和 DerivedB.h 的定义放入一个文件并从两个类的 cpp 文件中引用它? 真的不能说绝对更好。一般来说,分离越多越好,但也有很多相反的例子。我要说的是,合并两个单独的东西通常比将一个合并的东西分成两个更容易。如果您将其分开,请保持这种状态,直到找到令人信服的理由进行更改。【参考方案2】:

当你从同一个基类的两个类继承时,你应该尝试在继承时使用关键字“virtual”。我相信它可以帮助您解决虚拟表中的困惑。查找虚拟继承以获取示例。

【讨论】:

我什至没有在我的问题中提到“虚拟”,我知道如何使用这个关键字。 这不是解决多重继承问题的方法吗?也许我读错了,因为您不在钻石继承案中。 @JohnYang - 这是解决一些多重继承问题的方法。而且,是的,它可能不会在这里解决任何问题,尽管这只是猜测,因为问题包含无代码

以上是关于C++ 包含两个派生自同一个基类的类的主要内容,如果未能解决你的问题,请参考以下文章

C++类的继承与派生

检查一个对象的类是不是派生自C++中另一个对象的类

C++笔记-类层次结构

大型程序的工具——多重继承与虚继承

c++基类包含派生类的实例

通过基类指针C++访问派生类的成员