2012-09-21 61 views
1

有人问我在采访这个问题。以下程序创建了多少个虚拟表,以及每种情况下都有多少虚拟表。混乱通过虚拟表

#include <iostream> 
using namespace std; 
class A 
{ 
virtual void func1() 
{ 
    cout << "0 " <<endl; 
} 

virtual void func2() 
{ 
    cout << "1 " <<endl; 
} 
}; 

class B:Public A 
{ 
    void func1() 
    { 
    cout << "2" <<endl; 
    } 
}; 

class C:public B 
{ 
virtual void func2() 
{ 
    cout << "3" <<endl; 
} 
} 

int main() 
{ 
A* objA; 

B objB ; 
C objC ; 

//case1: 
objA = &objB; 
objA->func1(); 
//case2: 
objA = &objC; 
objA->func2(); 
objA->func1(); 
return 0; 
} 

我在B类中感到困惑吗?它是否为B类创建了一个vtable?在这种情况下哪个函数会被调用。有人可以解释我。类B的

+0

程序不编译;问的问题是学术问题。你是指'A * objA;'或'objA = * objB'和'objA = * objC'? –

+0

首先,上面的代码甚至没有编译,所以没有输出。不要喂我们。其次,有一个精彩的文章中博士道博的,[多重继承认为是有用的(http://www.drdobbs.com/multiple-inheritance-considered-useful/184402074?pgno=1),你能看的懂如何继承和虚拟方法表工作。 –

+0

感谢您的文章。它是一个伪代码。基本上我想知道vtable是否为B类创建? – user1687824

回答

1

看评论

// I'll pretend you have a #include <stdio.h> here 

class A 
{ 
virtual void func1() 
{ 
    print 0; // error!! I'll pretend this was puts("0"); 
} 

virtual void func2() 
{ 
    print1; // error!! I'll pretend this was puts("1"); 
} 
}; 

// there is a virtual table for class A. (for two virtual methods) 


class B:Public A 
{ 
    void func1() 
    { 
    print2; // error!! I'll pretend this was puts("2"); 
    } 
}; 

// there is a virtual table for class B. (for two virtual methods) 


class C:public B 
{ 
virtual void func2() 
{ 
    print 3; // error!! I'll pretend this was puts("3"); 
} 
} 

// there is a virtual table for class C. (for two virtual methods) 


int main() 
{ 
A objA; 
B* objB = new B(); 

C* objC = new C(); 

//case1: 
objA = &objB; // error!! left side of type A right side of type B** 
objA->func1(); // error!! operator -> on non pointer 

//case2: 
objA = &objC; // error!! left side of type A right side of type B** 
objA->func2(); // error!! operator -> on non pointer 
objA->func1(); // error!! operator -> on non pointer 
return 0; 
} 

// nothing is printed 

由于您编辑了OP代码,因此它是新版代码的答案。看评论:

#include <iostream> 
using namespace std; 
class A 
{ 
virtual void func1() 
{ 
    cout << "0 " <<endl; // it's ok, but is the space supposed to be there? 
} 

virtual void func2() 
{ 
    cout << "1 " <<endl; // it's ok, but is the space supposed to be there? 
} 
}; 
// there is a virtual table for class A. (for two virtual methods) 

class B:Public A // error!! I'll pretend Public was public (lowercase) 
{ 
    void func1() 
    { 
    cout << "2" <<endl; // it's ok, but here there's no space, is that correct? 
    } 
}; 
// there is a virtual table for class B. (for two virtual methods) 

class C:public B 
{ 
virtual void func2() 
{ 
    cout << "3" <<endl; // it's ok, but here there's no space, is that correct? 
} 
} 
// there is a virtual table for class C. (for two virtual methods) 

int main() 
{ 
A* objA; 

B objB ; 
C objC ; 

//case1: 
objA = &objB; 
objA->func1(); // outputs (to stdout) a '2' (two) and whatever a 
       // newline is on your system (could be '\r' or '\n' or both 
       // or in fact anything your platform defines a newline is) 
       // stdout is then flushed. 
//case2: 
objA = &objC; 
objA->func2(); // outputs (to stdout) a '3' (three) and whatever a 
       // newline is on your system (could be '\r' or '\n' or both 
       // or in fact anything your platform defines a newline is) 
       // stdout is then flushed. 

objA->func1(); // outputs (to stdout) a '2' (two) and whatever a 
       // newline is on your system (could be '\r' or '\n' or both 
       // or in fact anything your platform defines a newline is) 
       // stdout is then flushed. 
return 0; 
} 
// the output is '2' <newline> '3' <newline> '2' <newline> 
// where the actual character(s) for <newline> are platform dependent 
+0

检查代码现在 – user1687824

+0

其相当接近现在编译,无论如何,但如果你是真正* *编译它,你可能会发现,“公共”和“公众”是不是同义词。 – WhozCraig

+0

到编辑OP代码 –

0

实例是类型A的情况下也是如此。您的B级要求A类构造函数,如果B不从A然后覆盖FUNC1()B具有A的虚拟FUNC2()和FUNC1的倍率()