【问题标题】:C++ call virtual method in child classC++在子类中调用虚方法
【发布时间】:2009-09-30 15:14:36
【问题描述】:

我有以下课程:

class A {
protected:
     A *inner;
public:
    ....
    virtual void doSomething() = 0;
    ....
}

class B: public A {
   ...
   void doSomething() {
       if(inner != NULL)
           inner->doSomething();
   }
   ...
}

当我使用inner->doSomething() 时,我遇到了分段错误。 在 B 类中调用inner->doSomething() 应该怎么做?

提前致谢。

【问题讨论】:

  • 如果你在使用inner时遇到segfault,可能是因为它没有指向一个有效的对象。如何在 B 中初始化 inner?
  • 每个 A 都包含一个 A*?真的吗?为什么?
  • 好的,他们正在看着对方。我只是想检查一下。

标签: c++ virtual-functions


【解决方案1】:

如果没有显式初始化内部成员,它可能既不是 NULL 又指向无效内存。你能告诉我们明确初始化inner的代码吗?

A 的适当构造函数如下

protected:
A() : inner(NULL) {
  ...
}

【讨论】:

  • 替代 JaredPar 的建议,在构造函数中指定 inner = NULL。在子类的doSomething()中插入断点,观察inner的值?
  • 没有初始化它,因为我预计它会是 NULL 并且 if 语句是错误的。我不知道一个对象可能既不是 NULL 又指向无效内存。我刚刚在 B 的构造函数处做了 inner = NULL 并解决了这个问题。非常感谢。
  • 注意:对于所有标准类型(指针、int、float 等......也称为内置类型),变量在构建时未初始化(没有“默认构造函数”)。因为'inner'是A的一个属性,所以初始化它是A的构造函数的职责,否则每个子类都会有问题...
  • 好的,Matthieu,将内部初始化放在 A 的构造函数中,谢谢!
  • 可以缩短为A() : inner() { ... },尽管更明确的形式更具可读性。
【解决方案2】:

虽然如果您将 A* 分配为与 B 初始化 this 指针相同,您将获得堆栈溢出...您需要内部的任何理由?你不能直接调用 A::DoSomething() 吗?

【讨论】:

    猜你喜欢
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多