classA { public: long varA; virtualvoidfunA1(){ std::puts("A::funA1()");}; virtualvoidfunA2(){ std::puts("A::funA1()");}; };
classB { public: int varB; virtualvoidfunB1(){ std::puts("B::funB1()");}; virtualvoidfunB2(){ std::puts("B::funB2()");}; };
classC:public A, public B { public: int varC; virtualvoidfunA1(){ std::puts("C::funA1()");}; virtualvoidfunB2(){ std::puts("C::funB2()");}; virtualvoidfunC(){ std::puts("C::funC()");}; };
先思考下面几个问题
A, B, C的对象大小应该都是多大?
有 A* a = new C();, 那么 typeid(*a) 返回的会 A 的信息,还是 C 的信息?
classA { public: long varA; virtualvoidfunA1(){ std::puts("A::funA1()");}; virtualvoidfunA2(){ std::puts("A::funA1()");}; };
classB { public: int varB; virtualvoidfunB1(){ std::puts("B::funB1()");}; virtualvoidfunB2(){ std::puts("B::funB2()");}; };
classC:public A, public B { public: int varC; virtualvoidfunA1(){ std::puts("C::funA1()");}; virtualvoidfunB2(){ std::puts("C::funB2()");}; virtualvoidfunC(){ std::puts("C::funC()");}; };
intmain(int argc, char **argv){ C c; using Fun = void (*)(); Fun *virtual_table = ((Fun**)&c)[0];
classBase { public: long varBase{1}; virtualvoidfunBase(){ std::puts("Base::funBase"); }; };
classA :virtualpublic Base { public: long varA{2}; virtualvoidfunA1(){ std::puts("A::funA1"); }; virtualvoidfunA2(){ std::puts("A::funA2"); }; };
classB :virtualpublic Base { public: long varB{3}; virtualvoidfunB1(){ std::puts("B::funB1"); }; virtualvoidfunB2(){ std::puts("B::funB2"); }; };
classC :public A, public B { public: long varC{4}; virtualvoidfunA1(){ std::puts("C::funA1"); }; virtualvoidfunB2(){ std::puts("C::funB2"); }; virtualvoidfunC(){ std::puts("C::funC"); }; };