Total Articles 494
function을 virtual로 선언해도 non-virtual call로 실행되는 경우도 있네요.
[Source]
- #include <iostream>
- using namespace std;
- struct Obj {
- void fooA() { cout << "Obj::fooA\n"; }
- void fooB() { cout << "Obj::fooB\n"; }
- void fooC() { cout << "Obj::fooC\n"; }
- virtual void vfooA() { cout << "Obj::vfooA\n"; }
- virtual void vfooB() { cout << "Obj::vfooB\n"; }
- virtual void vfooC() { cout << "Obj::vfooC\n"; }
- };
- void test1(Obj obj) {
- obj.fooA();
- obj.fooB();
- obj.fooC();
- // mov -0x8(%rbp),%rax ;
- // mov %rax,%rdi ; rdi에 obj 포인터 값 넣음
- // callq 0x561805916ab8 <Obj::fooC()> ; non-virtual call
- obj.vfooA();
- obj.vfooB();
- obj.vfooC();
- // mov -0x8(%rbp),%rax ;
- // mov %rax,%rdi ; rdi에 obj 포인터 값 넣음
- // callq 0x561805916b2a <Obj::vfooC()> ; non-virtual call
- }
- void test2(Obj* obj) {
- obj->fooA();
- obj->fooB();
- obj->fooC();
- // mov -0x8(%rbp),%rax ;
- // mov %rax,%rdi ; rdi에 obj 포인터 값 넣음
- // callq 0x561805916ab8 <Obj::fooC()> ; non-virtual call
- obj->vfooA();
- obj->vfooB();
- obj->vfooC);
- // mov -0x8(%rbp),%rax ; rax에 obj 포인터 값 넣음
- // mov (%rax),%rax ; rax에 A struct의 virtual method table 포인터 값 넣음
- // add $0x10,%rax ; rax에 vfooC 함수의 포인터를 가르키는 포인터 값 넣음
- // mov (%rax),%rax ; rax에 vfooC 함수의 포인터 값 넣음
- // mov -0x8(%rbp),%rdx ;
- // mov %rdx,%rdi ; rdi에 obj 포인터 값 넣음
- // callq *%rax ; virtual call
- }
- int main() {
- Obj obj;
- test1(obj);
- test2(&obj);
- return 0;
- }
[Enviromnent]
$ uname -aLinux kali 4.12.0-kali2-amd64 #1 SMP Debian 4.12.12-2kali1 (2017-09-13) x86_64 GNU/Linux$ g++ --versiong++ (Debian 7.2.0-5) 7.2.0Copyright (C) 2017 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[Download]