首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有派生对象指针的基类:如何区分彼此的存在?

具有派生对象指针的基类:如何区分彼此的存在?
EN

Stack Overflow用户
提问于 2016-04-27 20:48:03
回答 2查看 48关注 0票数 0

下面是一个很小的例子。我有一个基类,它需要知道派生类。反过来,派生类需要知道基类。那么,我如何定义他们,使他们知道彼此的存在?

代码语言:javascript
复制
class Base {
  Deriving* d;
public:
  Base(Deriving* deriving) {
    d = deriving;
  }
  void f() {
    d->g();
  }
};

class Deriving : public Base {
public:
  Deriving() : Base(this) {}
  g();
};

下面是我尝试过的以及编译器所说的:定义Base首先导致error: 'Deriving' does not name a type。定义Deriving首先导致error: expected class-name before '{' token。声明不完整类型的BaseDeriving将导致error: invalid use of incomplete type 'class X'。我不知道还能尝试什么。

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-27 21:16:40

在Base中,只有函数f需要知道类Deriving的定义,所以在定义Deriving之后定义它。

代码语言:javascript
复制
class Deriving;

class Base {
      Deriving* d;
    public:
      Base(Deriving* deriving) {
        d = deriving;
      }
      void f();
};

class Deriving : public Base {
    public:
      Deriving() : Base(this) {}
      void g();
};

void Base::f()
{
    d->g();
}
票数 2
EN

Stack Overflow用户

发布于 2016-04-27 23:43:02

这种安排通常是逻辑上的错误。基类不应该需要知道任何关于派生类的信息。如果基类中的方法需要使用恰好存储在派生类中的资产,那么对这些资产的引用可以传递给函数f()。

在上面的示例中,可以通过继承实现所需的行为:

就像这样:

代码语言:javascript
复制
class Base
{
public:
  void f() {
    impl_f();
  }
private:
  virtual void impl_f() = 0;
};

class Derived : public Base
{
private:
  void impl_f() override
  {
    // whatever g() was going to do...
  }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36900580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档