基类成员函数是否可以直接访问子类成员函数?
我从Android上找到了代码,BufferQueue继承了BnSurfaceTexture,有一个成员函数requestBuffer。
在基类BnSurfaceTexture中,我发现它只是直接调用requestBuffer。
基类BnSurfaceTexture是怎么知道函数“requestBuffer”的?
谢谢
基类成员函数:
status_t BnSurfaceTexture::onTransact(
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
switch(code) {
case REQUEST_BUFFER: {
CHECK_INTERFACE(ISurfaceTexture, data, reply);
int bufferIdx = data.readInt32();
sp<GraphicBuffer> buffer;
/* it call requestBuffer directly */ <--------
int result = requestBuffer(bufferIdx, &buffer);
reply->writeInt32(buffer != 0);
子类声明&实现:
class BufferQueue : public BnSurfaceTexture {
private:
virtual status_t requestBuffer(int slot, sp<GraphicBuffer>* buf);
status_t BufferQueue::requestBuffer(int slot, sp<GraphicBuffer>* buf) {
ATRACE_CALL();
ST_LOGV("requestBuffer: slot=%d", slot);
Mutex::Autolock lock(mMutex);
...
return NO_ERROR;
}
最佳答案
How does the base class BnSurfaceTexture know the function "requestBuffer"?
此函数必须至少在基类中声明(它可以用一些默认实现定义)并且它必须是虚拟的
。
因此,在编译时,编译器会发现存在这样的函数。
函数调用在运行时解析。这就是多态。
小例子:
class Base
{
public:
virtual void f() { /* Base */ } // could be pure virtual
virtual void g() { f(); };
};
class Derived: public Base
{
public:
virtual void f() { /* derived */ }
};
当你有
Base* pB = new Derived;
pB->g();
g()
将调用 Derived::f
;
关于android - 基类成员函数直接访问子类成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12953883/