继承:选择要继承的基类方法[关闭]
Posted
技术标签:
【中文标题】继承:选择要继承的基类方法[关闭]【英文标题】:Inheritance: Selecting which base class methods to inherit [closed] 【发布时间】:2014-01-08 14:02:52 【问题描述】:我有一个类Base
,想写一个类Derive
,它只继承Base
的一些成员函数。有什么方便的方法吗?
例如,
class Base
...
void fooA();
void fooB();
...
我希望定义一个class Derive
,它从Base
继承除fooB
之外的所有成员。
【问题讨论】:
“派生”是什么意思? 如果Derived
中只有fooB
,那么它的所有其他成员都将派生自Base
。你的意思是“覆盖”吗?
在谈论类关系时通常使用“派生”一词(“A类派生于B类,因此B是基类)。当我们谈论函数时,我们使用“覆盖”一词和“继承”:A 类覆盖 fooA 但继承 fooB(IOW,fooA 在 A 类中具有不同的实现,但 fooB 保持不变)。您能否考虑到这一点重新表述您的问题?
@molbdnilo 正好相反。
您的问题在当前形式下毫无意义。你应该澄清一下。
【参考方案1】:
当您从基类派生子类时,您会从基类继承所有 成员函数(构造函数和析构函数除外,它们永远不会被继承)。您无法挑选要派生的成员。
但是,这似乎是XY Problem。根据您真正想要做什么,您或许能够实现您的实际目标。
您可以更改派生方法的可见性:
class Derived : public Base
private:
using Base::fooB; // fooB() is now private
;
您可以使用私有继承,然后只公开您希望提供的那些方法:
class Derived : private Base
public:
using Base::fooA; // Only fooA() is public here
;
您可以完全避免继承,而改用encapsulate Base
,并为Base
中您希望为其提供访问权限的资源提供bridge methods:
class Derived
Base mBase; // private
public:
void fooA() mBase.fooA();
;
但是,请注意,在后两种情况下,您会失去一些多态性的好处。为了让Base*
指向实际上是Derived
的东西,您必须使用公共继承。
【讨论】:
请注意,在最后两种情况下,Base *
不能指向 Derived
对象。这仅适用于公共继承,它建立 is-a 关系
如果我记得 C++ 继承是对的,那么您在第一种情况下也会失去多态性。如果你声明一个 Base 类型的变量并分配一个 Derived 类型的实例,它不会调用派生方法 fooB 而是来自基类的那个?或者它甚至会抛出一些错误?
@thuri:这里没有virtual
方法,所以一开始就没有多态性。但如果有,你可以做Base* p = new Derived;
然后调用这些虚拟,得到你想要的多态行为。我怀疑你还记得多态性是如何不正确地工作的。
@John :-) 我现在在 Java 和 C# 上花了很长时间。当然,您是对的,必须在 C++(和 C#)中使用 virtual 才能获得真正的多态性。但是我很好奇的是,如果您将 fooB 指定为虚拟并在派生类中将 fooB 设为私有,会发生什么?这会带来编译器错误吗?如果不是,在这种情况下运行时行为会是什么?
完美答案,正是我想要的答案。【参考方案2】:
如果我是对的,那么您正在寻找的是继承。这意味着如果 A 继承 B,它会继承 B 的方法和属性,当且仅它们被清除为 protected 或 public。
检查这些链接:
-
http://www.cplusplus.com/doc/tutorial/inheritance/
http://www.youtube.com/watch?v=gq2Igdc-OSI
【讨论】:
【参考方案3】:您可以将 fooB 设为私有,它在派生类中将不可见。 了解 private/protected/public 修饰符和 public/private/protected 继承。这些是您需要的工具。
【讨论】:
使 fooB 私有工作,但也使它不能被类Base
的实例调用。但是在我的程序中,我不想对Base
类做任何破坏性的事情。还有其他方法吗?以上是关于继承:选择要继承的基类方法[关闭]的主要内容,如果未能解决你的问题,请参考以下文章