很确定这是一个简单的问题,但我刚从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()
调用B
对x()
的定义;事实上,它正在调用A
对x()
的定义。
我不想让x()
虚拟,因为A
的每个子类都必须定义x()
;如果子类没有提供它,我想使用A的x()
定义。
答案 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()的定义,而不是本地作用域定义。