超类的成员函数可以访问子类的成员函数吗?如何?

时间:2014-04-30 22:26:09

标签: c++ inheritance

很确定这是一个简单的问题,但我刚从Ruby世界过来,那里的一切都是独角兽和彩虹,我需要一个严肃的现实调整。 (我也怀疑这个问题的标题措辞不正确,但我不知道我要问的C ++术语。)

问题

在以下代码中,如何让B::complex_method_on_x()使用B::x()返回的值?实际上,它使用A::x()返回的值。 (printf()应该让我明白我所期待的。)

代码

#include <stdio.h>

class A {
public:
  int x() { return 42; }
  int complex_method_on_x() { return 2 * x(); }
};

class B : public A {
public:
  int x() { return 1; };
};

int main() {
  A a;
  B b;
  printf("a.x() = %d (expect 42)\n", a.x());
  printf("a.complex_method_on_x() = %d (expect 84)\n", a.complex_method_on_x());
  printf("b.x() = %d (expect 1)\n", b.x());
  printf("b.complex_method_on_x() = %d (expect 2)\n", b.complex_method_on_x());
  return 0;
}

运行它,我得到:

$ ./test_subclass
a.x() = 42 (expect 42)
a.complex_method_on_x() = 84 (expect 84)
b.x() = 1 (expect 1)
b.complex_method_on_x() = 84 (expect 2)

具体来说,在课程B中,我不想重新输入complex_method_on_x()的定义;我想从超类中继承它。但我希望complex_method_on_x()调用Bx()的定义;事实上,它正在调用Ax()的定义。

我不想让x()虚拟,因为A的每个子类都必须定义x();如果子类没有提供它,我想使用A的x()定义。

3 个答案:

答案 0 :(得分:3)

#include <stdio.h>

class A {
public:
  virtual int x() { return 42; }
  int complex_method_on_x() { return 2 * x(); }
};

class B : public A {
public:
  int x() { return 1; };
};

int main() {
  A a;
  B b;
  printf("a.x() = %d (expect 42)\n", a.x());
  printf("a.complex_method_on_x() = %d (expect 84)\n", a.complex_method_on_x());
  printf("b.x() = %d (expect 1)\n", b.x());
  printf("b.complex_method_on_x() = %d (expect 2)\n", b.complex_method_on_x());
  return 0;
}

在A :: x()

上添加虚拟

答案 1 :(得分:0)

超类可以使用虚拟保留关键字访问子类方法来声明abstract functions

class baseClass {
  public:
  baseClass(){
    PrintClassName();
  }

  virtual void GetClassName()=0;
};

class subClass : public baseClass {
  public:
  virtual void GetClassName(){cout<<"buttonClass";}
};

适用于您的案件:

class A {
public:
   int complex_method_on_x() { return 2 * subclass_x(); }
   virtual void subclass_x()=0;
};

class B:public A{
   virtual void subclass_x(){return 1}
};

答案 2 :(得分:-3)

我不确定这对C ++有什么用处,不知道我自己的语言细节,但我认为将代码更改为

int complex_method_on_x() { return 2 * self.x(); }

会做到这一点。基本上,强制complex_method_on_x()内的x()来引用调用类&#39; x()的定义,而不是本地作用域定义。