继承:选择要继承的基类方法[关闭]

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 类做任何破坏性的事情。还有其他方法吗?

以上是关于继承:选择要继承的基类方法[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

是否建议让所有类都从 C++ 中的基类继承?

继承与此类相同的基类的类的继承

当涉及部分虚拟继承时,这是计算创建的基类对象数量的正确方法吗?

为啥 C# 中的基类允许实现接口契约而不继承它?

您可以拥有与您继承的基类相同的类的私有成员吗?

从继承的类中覆盖虚拟方法但保留基类的注释[重复]