考虑:
class Mobile {
double memory_util;
public:
virtual void power_save(double duration) = 0;
};
class Laptop : public Mobile {
bool is_unlocked;
protected:
bool is_charged;
public:
void power_save(double duration);
virtual double remaining_time();
};
class NegativeNumber {};
class IPad : public Laptop {
int generation;
public:
void power_save(double duration);
bool isJailBroken();
};
class HPLaptop : public Laptop {
int warranty_years;
public:
void extend_warranty(int years);
};
class HPdv6 : public HPLaptop {
bool repaired;
public:
double remaining_time(){ return HPLaptop::remaining_time(); }
bool is_repaired { return repaired; }
};
您想要执行以下操作:
int main () {
Mobile* d = new HPdv6();
Laptop *s = d;
d->power_save(100);
cout << “remaining operation time: ” <<
s->remaining_time() << endl;
return 0;
}
这里实际上会调用哪些方法?我知道Mobile是一个虚函数,但是当你有这样的指针时,我不确定如何处理类层次结构。是否有关于类层次结构的提示会使处理各种继承类的问题更容易理解?
谢谢。
答案 0 :(得分:3)
在Laptop *s = d;
(见static_cast<>()
)中排除错误后,您会发现HPdv6
remaining_time()
将被调用Laptop
'将调用power_save()
。
为了过度简化,通过从HPdv6
开始并沿着继承树向上走,直到找到方法来解析函数。 IPad
将不会被使用,因为它不会出现在HPdv6
和Laptop
之间,而是位于一个单独的分支中。
如果您想要非过度简化的版本,请查看vtables
。以下是关于它们的维基百科文章:http://en.wikipedia.org/wiki/Virtual_method_table