具有类层次结构时按什么顺序调用方法
In what order are methods called when you have class hierarchy?
考虑:
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 是一个虚拟函数,但是当您有这样的指针时,我不确定如何处理类层次结构。 是否有任何关于类层次结构的提示可以使处理各种继承类的问题更容易理解?
谢谢。
一旦你整理了Laptop *s = d;
中的错误(见static_cast<>()
),你会发现HPdv6
的remaining_time()
会被调用,Laptop
的power_save()
会被调用。
为了简化起见,通过从HPdv6
开始并沿着继承树向上移动直到找到该方法来解决函数。 IPad
不会被使用,因为它不会出现在HPdv6
和Laptop
之间,它位于一个单独的分支中。
如果需要非过度简化的版本,请查找vtables
。 这是关于它们的维基百科文章:http://en.wikipedia.org/wiki/Virtual_method_table
相关文章:
- 什么时候调用组成单元对象的析构函数
- 什么时候调用析构函数
- 变量按什么顺序相乘
- QNetworkReply::done() 信号是按顺序调用还是同时调用?
- libavdevice 和 x11 的静态链接库应该以什么顺序链接?
- 构造函数中没有参数的对象类成员按什么顺序初始化?
- 我不明白在这个例子中什么时候调用构造函数
- 正确的方法是什么?调用指针到指针到指针内部的函数?
- 什么时候调用CMFCListCtrl::OnGetCellBkColor函数?
- 什么时候调用 glFlush 太频繁了
- 操纵器,C 我应该使用什么顺序
- 这种情况以什么顺序发生
- 在 c++ 中应按什么顺序释放内存?
- 以特定顺序调用功能
- variadic模板函数会以相反的顺序调用lambda参数
- 具有类层次结构时按什么顺序调用方法
- 我应该按什么顺序发送callback()并通知服务员?
- 执行 Qt::QueuedConnection 信号始终按顺序调用
- Qt - 解决一个插槽上的两个顺序调用,并且仅执行一次操作
- 如果在一行中声明两个对象,则按什么顺序构造它们