C++覆盖特性在android源码中的实际应用

事情的起因是这样的:

用SourceInsight研究android源码,看到了一个这样的地方。

status_t AudioPolicyManager::startOutput(audio_io_handle_t output,
                                             audio_stream_type_t stream,
                                             audio_session_t session)
{
    //前面省略
//就是这个地方,真讨厌!!!!!!1
	ALOGV("before startSource");
    status_t status = startSource(outputDesc, stream, newDevice, &delayMs);
	ALOGV("after startSource");
//以下省略
}


代码位置:frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp


看着没?就是一个startSource的函数,我点击之后跳转到

status_t AudioPolicyManager::startSource(sp<AudioOutputDescriptor> outputDesc,
                                             audio_stream_type_t stream,
                                             audio_devices_t device,
                                             uint32_t *delayMs)
{
	ALOGV("AudioPolicyManager::startSource()");
结果被调用的这个日志死活打不出来。真的是活久见,活见鬼了。我在当前目录和附近的目录搜索了。就是没有看到别的实现。奇了怪了。

后来终于找到一个

class AudioPolicyManagerCustom: public AudioPolicyManager

真有子类啊。这里头还真有

startSource
而且名字一样。参数个数一样,参数类型都一样。

好吧,回到AudioPolicyManager类的定义部分

virtual status_t startSource(sp<AudioOutputDescriptor> outputDesc,
                             audio_stream_type_t stream,
                             audio_devices_t device,
                             uint32_t *delayMs);
虚函数

事情到了这里,基本上清晰了。

好的,现在翻到C++ primer,xxxx页,复习一下,C++覆盖的知识:

好吧,没法截图,书也不在身边,随便扒一个吧:

覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。

现在明白了,我所看到的诡异的现象产生的原因就是,发生了 覆盖

另外调用的地方其实也是用指针去调用的(好多现成的例子都是用指针来写),这地方是有一个隐藏的this指针的。

这么做有什么好处呢?比如说就说Andorid系统吧,谷歌给出了一个标准版,你可以不去改原来的系统,自己写个类,把原来的类给覆盖了,这就是定制了

猜你喜欢

转载自blog.csdn.net/bberdong/article/details/51799985