我已經閱讀了關於vtable並且理解了指向基類和派生類對象的基類指針的概念。 當基類和派生類都是對象並且派生類對象被分配給基類對象時,有人可以解釋如何創建vtable。情況3在下面的示例中使用基礎和派生對象的虛函數
#include <iostream>
#include <exception>
using namespace std;
class Base
{
public:
virtual void function1() { cout<<"Base - func1"<<endl; }
virtual void function2() { cout<<"Base - func2"<<endl; }
};
class Derived1: public Base
{
public:
virtual void function1() { cout<<"Derived1 - func1"<<endl; }
};
class Derived2: public Base
{
public:
virtual void function2() { cout<<"Derived2 - func2"<<endl; }
};
int main()
{
// Case 1
Base* B1 = new Derived1();
B1->function1();
B1->function2();
// Case 2
cout<<endl;
Base* B2 = new Derived2();
B2->function1();
B2->function2();
// Case 3
cout<<endl;
Base B3;
Derived1 D1;
B3=D1;
B3.function1();
B3.function2();
}
輸出:
Derived1 - func1
Base - func2
Base - func1
Derived2 - func2
Base - func1
Base - func2
您正在切割「B3」。 – Jarod42
只是指出,命名你的類D1,D2,然後你的變量B1,B2,B3可能會引起混淆。至少用變量名的小寫字母來表示它們不是類名。在你的代碼中使用某些約定可以幫助你和任何讀取它的人。 – aslg
除非您正在討論專門使用vtables技術來實現虛擬功能的實現,否則不應該使用「vtable」一詞。 C++語言本身沒有vtables的概念。 –