继承,从基方法调用重载方法
我有两个类:
class A {
int get();
string str();
}
string A::str() {
return string_with( get() );
}
class B : public A{
int get();
}
如果我这样做:
A a
B b
b.str()
b
将调用 A::str()
(好)并且它将使用 A::get()方法(不好!)。我希望,当我调用
b.str()
时,B::get()
由 str
使用。
如何让它发挥作用?
I have two classes:
class A {
int get();
string str();
}
string A::str() {
return string_with( get() );
}
class B : public A{
int get();
}
if I do:
A a
B b
b.str()
b
will invoke A::str()
(good) and it ill use A::get()
method (bad!). I want, that when I invoke b.str()
, the B::get()
is used by str
.
How to make it work?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
就让它虚拟吧。这正是虚拟的用途。
写出
A的定义。并且,为了使代码更容易理解,请在 B 中执行相同的操作。
顺便说一句,我假设您打算编写
class B : public A
。Just make it virtual. That's exactly what virtual is for.
Write
in A's definition. And, just to make the code more understandable, do the same in B's.
By the way, I'm assuming that you meant to write
class B : public A
.在面向对象编程的神奇术语中,有两种调用方法的方式:静态和动态分派。
在静态调度中,当您执行诸如
a.do_it()
之类的操作时调用的代码是静态确定的,也就是说,它是根据变量a
的类型确定的。在动态调度中,调用的代码是动态确定的,即根据
a
引用的对象的类型确定。当然,C++ 都支持两者。你如何告诉编译器你想要哪种类型的调度?简单:默认情况下,您具有静态调度,除非您将
virtual
放在方法声明中。In the magical word of Object-Oriented programming, there are two ways of calling a method: static and dynamic dispatch.
In static dispatch, the code called when you do something like
a.do_it()
is determined statically, that is, it is determined upon the type of the variablea
.In dynamic dispatch, the code called is determined dynamically, i.e., it is determined upon the type of the object referenced by
a
.C++, of course, supports both. How do you tell the compiler which type of dispatch do you want? Simple: by default you have static dispatch, unless you put the
virtual
in the method declaration.您可以使用 virtual 关键字。然后使用指针
B* b = new B;
b->str();
输出:
答::str()
B::获取()
You can use virtual keyword. and then use pointer
B* b = new B;
b->str();
the output:
A::str()
B::get()