我有两个班级:
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
。
如何让它发挥作用?
答案 0 :(得分:3)
让它成为虚拟的。这正是虚拟的目的。
写
virtual int get();
在A的定义中。并且,为了使代码更易于理解,请在B中执行相同的操作。
顺便说一句,我假设您打算写class B : public A
。
答案 1 :(得分:2)
在面向对象编程的神奇词汇中,有两种方法可以调用方法:静态和动态调度。
在静态分派中,当您执行a.do_it()
之类的操作时调用的代码是静态确定的,也就是说,它是根据变量a
的类型确定的。
在动态调度中,调用的代码是动态确定的,即根据a
引用的对象的类型确定。
当然,C ++支持两者。你如何告诉编译器你想要哪种类型的调度?简单:默认情况下,您有静态分派,除非您将virtual
放在方法声明中。
答案 2 :(得分:1)
您可以使用虚拟关键字。然后使用指针
class A
{
public:
virtual int get() { cout << "A::get()" << endl; return 0;}
string str()
{
cout << "A::str()" << endl;
get();
return "";
}
};
class B : public A
{
public:
virtual int get() { cout << "B::get()" << endl; return 0; }
};
B * b =新B; B-&GT; STR();
输出: A :: STR() B ::得到()