Android — Понимание IServiceManager :: getInterfaceDescriptor () не является статичным

Когда я читаю aospисточники, IServiceManager.cpp IServiceManager.hЯ нахожу код. Я знаю это из макроса

 DECLARE_META_INTERFACE (ServiceManager, "android.os.IServiceManager")IMPLEMENT_META_INTERFACE(ServiceManager, "android.os.IServiceManager");

#define DECLARE_META_INTERFACE(INTERFACE)                           \
static const android::String16 descriptor;                      \
static android::sp<I##INTERFACE> asInterface(                   \
const android::sp<android::IBinder>& obj);              \
virtual const android::String16& getInterfaceDescriptor() const;\
I##INTERFACE();                                                 \
virtual ~I##INTERFACE();

После перевода куска кода это так

class IServiceManager : public IInterface
{
public:
DECLARE_META_INTERFACE(ServiceManager);
.......

==>

class IServiceManager : public IInterface
{
public:
.......
const android::String16& getInterfaceDescriptor() const;  //macro be translated
.......

asInterface является static и ок. getInterfaceDescriptor не является static метод класса, но virtual const, Почему метод getInterfaceDescriptor может быть вызван IServiceManager класс прямо?

        virtual sp<IBinder> checkService( const String16& name) const
{
Parcel data, reply;
data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
data.writeString16(name);
remote()->transact(CHECK_SERVICE_TRANSACTION, data, &reply);
return reply.readStrongBinder();
}

Где я не прав? Если вы знаете, пожалуйста, скажите мне. Благодарю.

Я пишу тестовый код.

#include <iostream>

using namespace std;

class AA {
public:
virtual void bb() {
cout<<"sdfsdf";
}
};

int main(int argc, char *argv[]) {
AA::bb();
}

Ошибка случается.

Untitled 4.cpp:13:6: error: call to non-static member function without an object argument
AA::bb();
~~~~^~
1 error generated.

0

Решение

К сожалению, глупо для меня, просто потому что я не знаком с программированием на C ++. IServiceManager::getInterfaceDescriptor() быть вызванным в его производном классе. Так что это способ вызова метода экземпляра суперкласса. Я перепутал это с Java.

Тестовый код:

#include <iostream>

using namespace std;

class AA {
public:
virtual void aa() {
cout<<"sdfsdf";
}
};

class BB : public AA {
public:
void bb(){
AA::aa();
}

};

int main(int argc, char *argv[]) {
BB bObject;
bObject.bb();
}

Работает хорошо.

0

Другие решения

Других решений пока нет …